我正在通过Apress" Beginning Rails 4,3rd edition"书。本书通过逐步构建博客应用程序向您介绍Rails。我已经过了一半,并收到以下错误消息:
ActiveModel::ForbiddenAttributesError in CommentsController#create
我已将此跟踪到我的comments_controller.rb文件,如下所示:
class CommentsController < ApplicationController
before_filter :load_article
def create
@comment = @article.comments.new(params[:comment])
if @comment.save
redirect_to @article, :notice => 'Thanks for your comment'
else
redirect_to @article, :alert => 'Unable to add comment'
end
end
def destroy
@comment = @article.comments.find(params[:id])
@comment.destroy
redirect_to @article, :notice => 'Comment deleted'
end
private
def load_article
@article = Article.find(params[:article_id])
end
end
具体来说,问题似乎是由第5行引起的:
@comment = @article.comments.new(params[:comment])
从我收集到的内容来看,问题似乎是我正在编写的这本书是为早期版本的Rails编写的。我使用Rails 4.2.0,似乎我需要使用不同的语法。我需要更改什么才能使我的代码正常工作?
答案 0 :(得分:2)
你需要一个名为comment_params
的控制器中的私有方法(约定,你可以称之为任何东西)
控制器:
def create
@comment = @article.comments.new(comment_params)
if @comment.save
redirect_to @article, :notice => 'Thanks for your comment'
else
redirect_to @article, :alert => 'Unable to add comment'
end
end
private
def comment_params
params.require(:comment).permit!
end
它被称为strong_parameters并且是一个宝石,所以你可以谷歌它在github上找到它
params.require(:comment).permit!
将允许任何内容,您可能希望通过传递属性params.require(:comment).permit(:name, :message)
来限制它 - 假设您有名称和消息属性。
如果您有更新方法,则需要通过调用params[:comment]
方法替换comment_params
。
答案 1 :(得分:1)
您需要在创建模型对象之前执行此操作。在允许将参数放入其中之前,Rails必须对参数进行清理。
comment_params = params.require(:comments).permit(:attribute1, :attribute2)
@comment = @article.comments.new(comment_params)
答案 2 :(得分:1)
在方法load_article
下添加以下方法:
def comment_params
params.require(:comment).permit( ... )
end
并用您需要允许的属性替换这三个点。
然后在你的创建功能中你可以写
@comment = @article.comments.new(comment_params)
您可能需要在update
函数中执行类似操作。