在呈现的集合的部分中创建表单

时间:2015-05-12 19:05:40

标签: ruby-on-rails

我正在渲染Posts

的集合

在posts_controller.rb中:

def show
  @posts = Post.where("user_id = ?", id)
end

在show.html.erb中:

<ol>
  <%= render @posts %>
</ol>

在_post.html.erb中:

<%= form_for [post, @comment] do |f| %>
  <%= f.text_area :content %>
  <%= f.submit "Post" %>
<% end %>

form_for中的_post.html.erb是有人可以为任何呈现的帖子添加评论。评论也是Post类。这意味着posts_controller我需要@comment = Post.new(post_params)之类的部分内容。如果我只渲染一个帖子,这不会有问题。但是,我正在渲染一个Posts集合,每个Posts都需要传递给它的@comment实例变量。如何在每个帖子的@comment中创建posts_controller实例变量?我如何将这些@comments传递给部分?什么是部分中form_for中的正确代码?

2 个答案:

答案 0 :(得分:1)

您应该为每个帖子明确构建评论,如下所示

 def show
   @posts = Post.where("user_id = ?", id)
   @posts.each{|post| post.comments.build}
 end 

并在表格中使用相同的内容,

<%= form_for [post, post.comments.last] do |f| %>
 <%= f.text_area :content %>
 <%= f.submit "Post" %>
<% end %>

这将在呈现页面时为每个帖子构建注​​释,可以由post.comments.last访问。在提交与帖子关联的评论表单之前,评论将不存在于数据库中。

注意:如果默认范围已更改,则需要修改post.comments.last http://apidock.com/rails/ActiveRecord/Base/default_scope/class

答案 1 :(得分:0)

您应指定每个帖子包含/许多评论并构建那些

class Post   
   attribute :comments, type:Comment, typecaster: Comment, default: []
end


Class Comment
end

现在,您可以使用

进行简单渲染
<%=@post.comments%>

PS : Do not keep comment as a post type if you want to avoid rendering comments for comments and so on.(You can use the same type as well)