我在我的页面上创建了一个类似新闻源的功能,其中显示了您关注的人创建的所有帖子。就像 Facebook 一样,我希望用户能够直接从帖子下方的新闻源中发表评论。
这可能是一个简单的修复方法,但我一直无法找出最好的方法,甚至无法找到如何获取 post_id。
我当前的newsfeeds/index.html.erb看起来像这样:
<ul>
<% @activities.each do |activity| %>
<li> <%= image_tag(activity.owner.avatar.url(:thumb), height: "64", width: "64") %> <%= activity.owner.fullname %>
<ul>
<li><strong><%= activity.trackable.title %></strong></li>
<li><%= activity.trackable.content %></li>
<ul>
<li><%= render 'comments/form' %></li>
</ul>
</ul>
</li>
<% end %>
</ul>
comments/_form.html.erb:
<%= form_for [@post, @comment] do |f| %>
<%= f.text_area :content %>
<%= f.submit "Add comment" %>
<% end %>
然后我们就有了控制器:
newsfeeds_controller.rb
def index
@activities = PublicActivity::Activity.order("created_at desc").where(owner_id: current_user.friend_ids, owner_type: "User")
@comment = Comment.new
end
comments_controller.rb
class CommentsController < ApplicationController
before_filter :load_post
def create
@comment = @post.comments.build(params[:comment])
@comment.user = current_user
if @comment.save
@comment.create_activity :create, owner: current_user
redirect_to @post, notice: "Comment was created."
else
render :new
end
end
....
def load_post
@post = Post.find(params[:post_id])
end
end
所以我的问题是如何解决它,以便我存储 post_id 并找到它?
据我所知,评论表单似乎对嵌套路由(即 /posts/:post_id/comments)进行了发布请求。然后将从 CommentsController 中的 url 检索 post_id。
当前的'comments/_form.html.erb'部分需要@post变量才能生成正确的操作url(在这种情况下@post变量似乎没有在任何地方设置)。
要解决这个问题,您可以将“post”作为局部变量传递给表单部分。这样你的表单部分就能够创建正确的 url,并且你的控制器将能够访问 post_id。
另请参阅http://guides.rubyonrails.org/layouts_and_rendering.html#local-variables
newsfeeds/index.html.erb:
<ul>
<% @activities.each do |activity| %>
<li> <%= image_tag(activity.owner.avatar.url(:thumb), height: "64", width: "64") %> <%= activity.owner.fullname %>
<ul>
<li><strong><%= activity.trackable.title %></strong></li>
<li><%= activity.trackable.content %></li>
<ul>
<li><%= render 'comments/form', post: activity.trackable %></li>
</ul>
</ul>
</li>
<% end %>
</ul>
评论/_form.html.erb:
<%= form_for [post, @comment] do |f| %>
<%= f.text_area :content %>
<%= f.submit "Add comment" %>
<% end %>
(可能有更干净的方法来实现这一点)
要添加嵌套路由,请编辑“config/routes.rb”
resources :posts do
resources :comments
end
PS: 当在同一页面上多次呈现同一表单时,所有表单及其输入字段的 DOM id 将相同。为了避免这种情况,您应该在 form_for 调用中设置名称空间选项(请参阅此问题:
Rails:多次使用 form_for (DOM id))
评论/_form.html.erb:
<%= form_for [post, @comment], namespace: post.id do |f| %>
<%= f.text_area :content %>
<%= f.submit "Add comment" %>
<% end %>