0

我的控制器中有这样的代码:

def home
  @mainImage = []
  @mainImage.push(
    {:breakpoint => 1024, 
     :src => i_path('pages/home-d.jpg'),
     :src_2x => i_path('pages/home-d_2x.jpg')}
  )
  @mainImage.push(
    {:breakpoint => 768, 
     :src => i_path('pages/home-t.jpg'), 
     :src_2x => i_path('pages/home-t_2x.jpg')}
  )
  @mainImage.push(
    {:breakpoint => 320, 
     :src => i_path('pages/home-m.jpg'), 
     :src_2x => i_path('pages/home-m_2x.jpg')}
  )
  @alt = 'An image description'
  @defaultImage = i_path('pages/home-m.jpg')
end

视图中的哪个是在部分的帮助下呈现的。

我现在需要添加类似的功能来从回形针对象呈现模型属性。

现在看起来像这样:

@respImage.push(
  {:breakpoint => 1024, 
   :src => slide.image.url(:desktop_reg),
   :src_2x => slide.image.url(:desktop_retina)}
)
@respImage.push(
  {:breakpoint => 768, 
   :src => slide.image.url(:tablet_reg),
   :src_2x => slide.image.url(:tablet_retina)}
)

#...

最终目标是制作幻灯片,包含许多幻灯片。一张幻灯片有几个属性字符串和一个回形针属性。回形针属性对于每个图像尺寸有 6 种样式。

Rails 中将上述数据传输到视图的标准机制是什么?我假设这个通用数组不是最灵活的解决方案。


这就是代码结束的地方。

在控制器中:

def home
  @mainImage2 = RespImage.new(:alt => 'default homepage image')

  @mainImage2.add_breakpoint(BREAKPOINTS['desktop'],i_path('pages/home-d.jpg'),i_path('pages/home-d_2x.jpg'));
  @mainImage2.add_breakpoint(BREAKPOINTS['tablet'],i_path('pages/home-t.jpg'),i_path('pages/home-t_2x.jpg'));
  #...

模型/resp_image.rb :

class RespImage
  attr_accessor :alt, :breakpoints

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end

  def add_breakpoint(px,src,src_2x)
    self.breakpoints ||= [];
    self.breakpoints.push RespBreakpoint.new(:px => px, :src => src, :src_2x =>src_2x)
  end

  def add_paperclip_breakpoints(paperclip)
    add_breakpoint(BREAKPOINTS('desktop'), paperclip.url(:desktop_reg), paperclip.url(:desktop_retina));
    add_breakpoint(BREAKPOINTS('tablet'), paperclip.url(:tablet_reg), paperclip.url(:tablet_retina));
    add_breakpoint(BREAKPOINTS('mobile'), paperclip.url(:mobile_reg), paperclip.url(:mobile_retina));
  end

  def default_src
    self.breakpoints.sort.first.src
  end
end

模型/resp_breakpoint

class RespBreakpoint
  include Comparable

  attr_accessor :px,:src,:src_2x

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end

  def better_than?(other)
    self.px > other.px
  end

  def <=>(other)
    self.px <=> other.px
  end

  def eql?(other)
    self.px === other.px
  end
end

非常感谢下面的@Dave Newton

4

1 回答 1

1

首先,使用值对象。虽然哈希数组起初看起来很容易,但 VO 可以帮助轻松封装行为和数据,并提高可读性。

其次,考虑使这些 VO 成为“顶级”模型,以便可以使用适当命名的部分渲染它们,我假设这也会清理您的助手。

您问题的最后一部分在没有任何上下文的情况下有点不透明:“添加类似功能以从 Paperclip 对象呈现模型属性”是什么意思?对象是否具有相同的属性?数据是否已经由类或类的属性表示?

如果是后者,那么您可以使用鸭式打字来消除一些重复。


现在看起来这些信息存储起来有点时髦。我可能会稍微改变模型并使用一个散列,以断点为键(很有用,因为它是 CSS 用来触发样式更改的)或更语义化的东西(例如:desktop,,:tablet等)。

您的模型将包含哈希键作为属性(即breakpointsrcsrc_2x)。

这些值可以存储在任何地方,这取决于它们需要更改的频率。使用常量、YAML 文件或 Ruby 配置对象等可能就足够了。

数组本身将由实用程序类或服务对象创建,该对象采用一些参数来确定需要进入其中的信息。您可能有一个方法,该方法i_path根据传入的内容返回一个或幻灯片图像 URL(想想控制反转)。

或者它可能是一个装饰你的幻灯片模型的装饰器和一个假的(或真实的)模型i_path,等等。

于 2013-06-26T01:09:27.533 回答