0

我正在关注Rails 的一个很棒的入门级教程,这是一次很棒的体验——直到我遇到了这个

ActiveModel::MassAssignmentSecurity::Error in CommentsController#create

Can't mass-assign protected attributes: article_id

这就是 CommentsController 的样子

class CommentsController < ApplicationController

    def create
        article_id = params[:comment].delete(article_id)

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

        @comment.save

        redirect_to(article_path(@comment.article),
            :notice => "Comment added by #{@comment.author_name}.")
    end

end

根据教程,以这种方式编写 create 方法而不是仅仅编写 like @comment = Comment.new(params[:comment]and@comment.save是为了避免 Mass-Assignment 安全错误。我认为这是由于使用了不同版本的 rails 造成的,因为我正在运行 Rails 3.2.8,而该教程的作者在撰写本文时正在运行 Rails 3.2.2。

有人可以给我一个解决方案吗?谢谢

编辑:

我用谷歌搜索了一下,发现你可以使用 :as 选项来定义类的角色,但我真的不知道我是否应该在这里使用它。我今天刚开始学习 Rails,在了解了一些基础知识后,我仍在努力理解它。

EDIT2:迁移文件

class CreateComments < ActiveRecord::Migration
    def change
        create_table :comments do |t|
            t.integer :article_id
            t.string :author_name
            t.text :body
            t.timestamps
        end
    end
end
4

1 回答 1

0

您可能需要:article_id从参数中删除密钥,而不是article_id.

article_id = params[:comment].delete(:article_id)

代替

article_id = params[:comment].delete(article_id)

Ruby 不会为自赋值抛出未定义的错误,

a = a
=> nil
b = c
=> NameError
于 2012-09-23T08:29:49.800 回答