将image_tag转换为Rails中的视图助手

时间:2018-02-05 20:46:53

标签: ruby-on-rails

所以我在我的节目和索引中都使用了以下内容:

 <%= 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)%>

然后我最终得到[#,#,#,#]

2 个答案:

答案 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) %>