为什么我在创建新实例变量时Rails中的表单没有设置我的属性?

时间:2014-11-07 19:56:32

标签: ruby-on-rails forms parameters attributes

我正在尝试关注Jumpstart Labs Rails-Blogger Tutorial,我正在尝试为所创建的文章添加评论。

以下是我create评论时的代码:

def create
    @comment = Comment.create!(comment_params)
    flash.notice = "Your comment was created successfully!"

    redirect_to article_path(@comment.article_id)
end

def comment_params
    article_id = params[:article_id]
    params.require(:comment).permit(:author_name, :body)
end

当我在文章页面上,并尝试通过我的评论表单提交评论时,我收到此错误:

No route matches {:action=>"show", :controller=>"articles", :id=>nil} missing required keys: [:id]

我意识到它无法找到与我的评论相关联的article_id,但我找不到我的错误。显然没有在我的article_id方法中正确设置comment_params属性,我的问题是为什么它会给article_id一个零值?

请注意我也尝试过:

@comment.article_id = params[:article_id] :article_id = params[:article_id]

这些都不起作用。我曾尝试以多种方式将article_id作为符号,但它仍然给它一个零值。


修改

我认为包含它可能是有用的。以下是教程要做的事情:

def create
  @comment = Comment.new(comment_params)
  @comment.article_id = params[:article_id]

  @comment.save

  redirect_to article_path(@comment.article)
end

def comment_params
  params.require(:comment).permit(:author_name, :body)
end

但是,我想使用.create方法,这样它只使用一行。我的问题是当我尝试设置评论article_id时。这就是失败的地方,我不知道如何使用article_id方法设置.create,因为它会自动保存评论。


第二次编辑

以下是用于创建评论的表单:

<h3>Post a Comment</h3>

<%= form_for [ @article, @comment ] do |f| %>
  <p>
    <%= f.label :author_name, "Your name" %>
    <br/>
    <%= f.text_field :author_name %>
  </p>

  <p>
    <%= f.label :body, "Your comment" %>
    <br/>
    <%= f.text_area :body %>
  </p>

  <p>
    <%= f.submit 'Submit' %>
  </p>
<% end %>

第三次编辑

这是我的错误图片。请注意,它底部有一个带有正确article_id的哈希值,但它会为article_id指定一个nil值。

Local Host Error

2 个答案:

答案 0 :(得分:0)

您的article_id似乎为零。

首先,您的comment_params方法应该是这样的:

def comment_params
    params.require(:comment).permit(:author_name, :body, :article_id)
end

如果您不允许:article_id,它将被过滤掉并设置为nil。我怀疑这是发生了什么。

如果这不起作用,请确保您实际传递了参数中的article_id(检查服务器日志)。我想它可能在一个隐藏的领域或按钮params吗?

答案 1 :(得分:0)

添加

@comment.article_id = params[:comment][:article_id]

或者只需将article_id添加到您允许的参数中:

params.require(:comment).permit(:author_name, :body, :article_id)

并确保从视图中正确发送。