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)}
)

#...

の最終的な目的は、多くのスライドを含むスライドショーを作成することです。スライドには、いくつかの属性文字列と paperclip 属性があります。paperclip 属性には、画像サイズごとに 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'));
  #...

models/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