所以我有一个相当典型的博客应用程序,上面有帖子和评论。
每条评论都属于一个帖子 帖子可以有很多评论。
基本上我想在帖子的show动作中添加注释表单,而在评论模型中没有attr_accessible下的post_id。
在我的帖子控制器中,我有:
def show
@post = Post.find(params[:id])
@poster = "#{current_user.name} #{current_user.surname} (#{current_user.email})"
@comment = @post.comments.build( poster: @poster )
end
我不完全确定我应该在评论控制器中做什么(我不相信上面的代码是正确的,如果我是诚实的)。目前我有:
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(params[:post])
if @comment.save
redirect_to @post, notice: "Comment posted"
else
redirect_to @post, error: "Error!"
end
end
我的路线:
resources :comments
resources :posts do
resources :comments
end
最后是表格:
<%= form_for @post.comments.build do |f| %>
<%= f.label :content, "WRITE COMMENT" %>
<%= f.text_area :content, rows: 3 %>
<%= f.hidden_field :post_id, value: @post.id %>
<%= f.submit "Post" %>
<% end %>
这里的问题是我无法将post_id从posts控制器的show动作传递给comments控制器的create action。任何帮助深表感谢。提前谢谢!
答案 0 :(得分:4)
您的帖子控制器看起来很好......但假设您的路线看起来像
resources :posts do
resources :comments
end
然后你的CommentsController #creed应该/看起来像:
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(params[:comment])
if @comment.save
redirect_to @post, notice: "Comment posted"
else
redirect_to @post, error: "Error!"
end
end
你的表格:
<%= form_for [@post, @comment] do |f| %>
<%= f.hidden_field :poster, value: @poster %>
<%= f.label :content, "WRITE COMMENT" %>
<%= f.text_area :content, rows: 3 %>
<%= f.submit "Post" %>
<% end %>
答案 1 :(得分:0)
您的展示帖子的网址应该像post/show/(:id)
现在,在评论表单中,您可以放置一个隐藏字段,其值为params[:id]
。
hidden_field(:post_id, :value => params[:id])
提交表单时,可以使用隐藏字段获取post_id的值。
def create
@comment = Comment.new(params[:comment])
@comment.post_id = params[:post_id]
if @comment.save
flash[:notice] = 'Comment posted.'
redirect_to post_path(@comment.post_id)
else
flash[:notice] = "Error!"
redirect_to post_path(@comment.post_id)
end
end
答案 2 :(得分:0)
我会假设您的帖子模型有很多评论和评论belongs_to post
比你在路线文件中你可以做这样的事情
resources :posts do
resources :comments
end
这会给你一个url schem,比如
/ posts /:post_id / comments,允许您始终拥有评论parrent的post_id