所以我在我的节目和索引中都使用了以下内容:
<%= image_tag posts.avatar(:large), alt: 'Avatar for #{posts.title}', class: 'img-responsive' %>
因为它们都是相同的我试图将它们移动到视图助手。然后在我的观点中我会说:
<%= post_image_tag %>
我最初的看法如下:
def post_image_tag
image_tag posts.avatar(:large), alt: 'Avatar for #{posts.title}', class: 'img-responsive'
end
我最终得到:未定义的局部变量或方法`posts'for#&lt;#:0x007fcdd273e860&gt; 你的意思是? @posts
冷却。所以我将其改为:
def post_image_tag
image_tag @posts.avatar(:large), alt: 'Avatar for #{posts.title}', class: 'img-responsive'
end
现在我最终得到:未定义的方法`avatar'。
所以我决定可能只是我没有正确引用它并试图在一个帖子上拉ActiveRecord所以我尝试:
def post_image_tag
@posts.each do |posts|
image_tag posts.avatar(:large), alt: 'Avatar for #{posts.title}', class: 'img-responsive'
end
end
此时页面上会有最终呈现的内容。除了它看起来像HTML噩梦:
[#<SpudPost id: 1, spud_user_id: 2, title: "The Top ", content: "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transi...", comments_enabled: false, visible: true, published_at: "2018-01-30 14:45:58", created_at: "2018-02-05 17:41:42", updated_at: "2018-02-05 17:41:42", url_name: "the-top", is_news: false, meta_keywords: nil, meta_description: nil, content_format: "HTML", content_processed: nil, blog_key: "blog", custom_author: nil, identifier: "9b0d97c9-6855-4ad6-85ac-cade6012b5de", avatar_file_name: "ice.jpg", avatar_content_type: "image/jpeg", avatar_file_size: 68494, avatar_updated_at: "2018-02-05 17:41:40">,
它会进一步重复下一个项目和下一个项目等。我可以在image_tag中使用什么来使其正确渲染?我也尝试将视图中的视图助手更改为:
<%= raw(post_image_tag)%>
然后我最终得到[#,#,#,#]
答案 0 :(得分:2)
你在这个兔子洞里转了个弯。返回到您的第一个助手版本并将帖子作为参数传递
def post_image_tag(post)
image_tag(post.avatar(:large), alt: 'Avatar for #{post.title}', class: 'img-responsive')
end
# this "posts" should really be named "post", since it's a single post,
# not a collection of them.
<%= post_image_tag(posts) %>
答案 1 :(得分:0)
图片适用于1个帖子,因此您应该将变量命名为“post”而不是“posts”。无论如何,这只是为了清晰而不是错误。
您可以定义一个接受参数的帮助程序:
def post_image_tag post
image_tag post.avatar(:large), alt: 'Avatar for #{post.title}', class: 'img-responsive'
end
并以这种方式调用(假设帖子是1个帖子):
<%= post_image_tag(post) %>
如果@posts中有很多帖子,你应该这样做:
<%= @posts.each do |post| %>
<%= post_image_tag(post) %>
<% end %>
您还可以创建另一个帮助程序来处理许多帖子(可能需要进行一些更改,但您明白了这一点):
def posts_image_tag posts
result=''
posts.each do |post|
result += post_image_tag(post)
end
result.thml_safe
end
并以这种方式调用(假设@posts包含您的所有帖子):
<%= posts_image_tag(@posts) %>