【问题标题】:ActiveModel::ForbiddenAttributesError when tried to add new comment尝试添加新评论时出现 ActiveModel::ForbiddenAttributesError
【发布时间】:2016-10-03 20:46:57
【问题描述】:

我在 app/controllers/cmets_controller.rb 中有以下代码

class CommentsController < ApplicationController
  def create
    book = Book.find params[:book_id]
    comment = book.comments.new params[:comment]
    comment.save
    flash[:notice] = 'Comment saved'
    redirect_to book_path(book)     
  end
end

我不确定为什么在comment = book.comments.new params[:comment] 行出现错误

我尝试将comment = book.comments.new params[:comment] 更改为comment = book.comments.new(comment),但是当我点击保存时它没有显示对应用程序的评论

还尝试在下面做这样的事情

class CommentsController < ApplicationController
  def create
    book = Book.find params[:book_id]
#    comment = book.comments.new params[:comment]
     comment =  book.comments.new(comment_params)     
    comment.save
    flash[:notice] = 'Comment saved'
    redirect_to book_path(book)     
  end

 def comment_params
   params.require(:comment).permit()
 end

 end

【问题讨论】:

  • 您能否查看您的服务器日志 (log/development.log) 和/或控制台窗口,并向我们显示 full 错误消息 - 而不仅仅是您复制的内容标题,还有那两边的几行。通常在服务器日志中你会得到一个实际传递的参数的例子,有时它甚至会告诉你哪些属性是被禁止的。编辑您的问题并在此处添加信息(而不是在 cmets 中回复),因为 cmets 中的代码格式不可读:P
  • 另外params.require(:comment).permit() 这实际上是在告诉rails 你允许有一个params[:comment] 但你不允许任何参数在那个params[:comment] 中——所以如果你真的传递了一些东西(例如{ :content =&gt; "this is a comment", :author_id =&gt; 1234}) 那么你会得到你所看到的错误。但是查看我要求的日志将确认这一点(以及您需要做些什么来修复它)。
  • 谢谢我把它改成了@comment = book.cmets.create!(params.require(:comment).permit!) 但它在我刷新页面后显示评论。我相信当我点击保存时它应该显示它

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2


【解决方案1】:

这一行(顺便说一句 () 是可选的)

params.require(:comment).permit()

仅表示您不允许分配任何属性,因此错误。

添加属性列表(将它们列入白名单)以便能够分配它们:

params.require(:comment).permit(:name, :title, :other_attribute)

【讨论】:

    【解决方案2】:

    这个成功了

    class CommentsController < ApplicationController
      def create
        book = Book.find params[:book_id]
         #comment = book.comments.new params[:comment]
     @comment = book.comments.create!(params.require(:comment).permit!)    
         #comment =  book.comments.new(comment_params)     
        #comment.save
        flash[:notice] = 'Comment saved'
        redirect_to book_path(book)     
    
    end
     end
    

    【讨论】:

    • 我不推荐params.require(:comment).permit! 有两个原因。一个 - 传统上你把它放在一个单独的方法中,这样它也可以被编辑/更新操作重用。二 - 这实际上允许一切......包括允许用户使用他们的控制台添加user_id 字段,从而创建属于另一个用户的评论。你真的不想那样。您应该始终将允许用户更改的属性列入白名单。这就是首先设置此要求/许可行的目的。 :)
    猜你喜欢
    • 2013-11-20
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多