我有专辑和图片模型。在我的相册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::Image
类render
方法只是呈现html模板。问题是每个图像的name
和url
不同,但渲染的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
答案 0 :(得分:1)
thumbnail_template.gsub!更改常量并用实际值替换占位符。您可以添加dup来复制字符串
thumbnail_template = parameters.fetch(:thumbnail_template, THUMBNAIL_TEMPLATE).dup
或使用gsub而不是gsub!并将返回的值赋值给新变量。
如果代码尝试修改其值,您还可以向常量添加.freeze
以引发错误。
另外,为什么不渲染和.erb而不是手动操作字符串并重新发明轮子?