在循环中实例化新的类对象

时间:2014-03-22 18:23:45

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-2.0

我有专辑和图片模型。在我的相册show.html.erb中,我有以下代码:

<% @album.images.each do |image| %>

<p>
  <strong>name:</strong>
  <%= image.name %>
</p>

<p>
  <strong>url:</strong>
  <%= image.image_url(:thumb) %>
</p>

<%=  AlbumsHelper::Image.new({url:image.image_url(:thumb),
                             attributes:{title:image.name,
                                         description: image.description}
                            }).render.html_safe
%>

<% end %>

AlbumsHelper::Imagerender方法只是呈现html模板。问题是每个图像的nameurl不同,但渲染的html模板对于所有图像都是相同的。

我想我没有以正确的方式从AlbumsHelper::Image类中实例化新对象。谁能说出我做错了什么?

编辑:

  class Image

    IMAGE_NOT_FOUND = 'http://fuge.it/images/phoca_thumb_l_no_image.gif'
    THUMBNAIL_TEMPLATE = [
                          '<div class="view">',
                            '<div class="view-back">',
                              '<span data-icon="A">##title##</span>',
                              '<span data-icon="B">##description##</span>',
                              '<a href="##url##">→</a>',
                            '</div>',
                            '<div class="slice s1" style="background-image: url(##url##);">',
                              '<span class="overlay"></span>',
                              '<div class="slice s2" style="background-image: url(##url##);">',
                                '<span class="overlay"></span>',
                                '<div class="slice s3" style="background-image: url(##url##);">',
                                  '<span class="overlay"></span>',
                                  '<div class="slice s4" style="background-image: url(##url##);">',
                                    '<span class="overlay"></span>',
                                    '<div class="slice s5" style="background-image: url(##url##);">',
                                      '<span class="overlay"></span>',
                                    '</div>',
                                  '</div>',
                                  '</div>',
                                '</div>',
                            '</div>',
                          '</div>',
                          ].join('')

    attr_accessor :url,         # image source url
                  :attributes   # data attributes

    def initialize(parameters = {})
      @url = parameters.fetch(:url, IMAGE_NOT_FOUND)
      @attributes = parameters.fetch(:attributes, {})

      @url = IMAGE_NOT_FOUND unless File.extname(@url) =~/^(.png|.gif|.jpg)$/ #@url =~/^#{URI::regexp}$/ and
      @attributes = Hash.new unless @attributes.is_a?(Hash)
    end

    def to_s
      "<img src=#{@url} #{@attributes.map{|key,value| "data-#{key}=#{value}" }.join(' ')}/>"
    end

    def render(parameters = {})

      has_thumbnail = parameters.fetch(:has_thumbnail, 0)
      thumbnail_template = parameters.fetch(:thumbnail_template, THUMBNAIL_TEMPLATE)

      if has_thumbnail
        @attributes.map { |key, value| thumbnail_template["##{key}##"] &&= value }
        thumbnail_template.gsub!('##url##', @url)
        thumbnail_template
      else
        self.to_s
      end
    end


  end

1 个答案:

答案 0 :(得分:1)

thumbnail_template.gsub!更改常量并用实际值替换占位符。您可以添加dup来复制字符串

thumbnail_template = parameters.fetch(:thumbnail_template, THUMBNAIL_TEMPLATE).dup

或使用gsub而不是gsub!并将返回的值赋值给新变量。

如果代码尝试修改其值,您还可以向常量添加.freeze以引发错误。

另外,为什么不渲染和.erb而不是手动操作字符串并重新发明轮子?