关于职位的协会评论表格

时间:2014-11-03 17:37:55

标签: ruby-on-rails ruby-on-rails-4 railstutorial.org

我正在尝试创建与帖子相关的评论。有3种型号用户,微博和评论。 以下是我的关联:
评论模型

class Comment < ActiveRecord::Base
  belongs_to :user 
  belongs_to :micropost

  validates :user_id, presence: true
  validates :micropost_id, presence: true
end

Microposts模型

belongs_to :user
  has_many :comments, dependent: :destroy

用户模型

has_many :microposts, dependent: :destroy
  has_many :comments

我已将路线嵌套为:

resources :microposts do 
    resources :comments
  end

这是我的评论控制器:

class CommentsController < ApplicationController

  def create
    @micropost = Micropost.find(params[:micropost_id])
    @comment = @micropost.comments.build(params[:comment])
    if @comment.save
      flash[:success] = "Comment created"
      redirect_to current_user
    else
      render 'shared/_comment_form'
    end
  end
end

评论表:

<%= form_for([@micropost, @comment]) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Write your message.." %>
  </div>
  <%= f.submit "Post", class: "btn btn-primary" %>
<% end %>

当我运行这个时,我得到一个表格,我得到一个参数错误,
表单中的第一个参数不能包含nil或为空
我想知道如何解决这个问题?如果我只是编写微博,那么@comment似乎也无法识别它,我得到一个 未定义的局部变量错误。 为什么评论形式没有意识到微博是来自评论控制器来找到micropost_id?

1 个答案:

答案 0 :(得分:1)

让我们先了解这个表单是如何工作的。

如果您的资源已定义关联,例如,您希望在给定路由设置正确的情况下向微博添加注释:

<%= form_for([@micropost, @comment]) do |f| %>
 ...
<% end %>

在呈现表单之前定义@micropost@comment

示例:@micropost = Micropost.find(params[:id])@comment = Comment.new

稍后当您提交此表单时(仅在该步骤中),您的评论控制器会触摸您的创建操作。

基本上你需要做的是在调用form_for之前定义@micropost@comment