将Rails 4代码更新为Rails 4.2代码

时间:2015-04-08 15:39:32

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-4.2

我正在通过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,似乎我需要使用不同的语法。我需要更改什么才能使我的代码正常工作?

3 个答案:

答案 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函数中执行类似操作。