从Rails中另一个对象的show动作创建一个对象

时间:2012-07-23 18:07:42

标签: ruby-on-rails activerecord

所以我有一个相当典型的博客应用程序,上面有帖子和评论。

每条评论都属于一个帖子 帖子可以有很多评论。

基本上我想在帖子的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。任何帮助深表感谢。提前谢谢!

3 个答案:

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