我不明白的一行Ruby代码给了我一个质量分配错误

时间:2012-05-23 19:44:01

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

我正在阅读Rails 3 In Action。本书创建了一个应用程序,可以创建项目,并为每个项目创建票证。它创建了3个模型:

项目:

    class Project < ActiveRecord::Base
      attr_accessible :name
      validates :name, presence: true
      has_many :tickets, :dependent => :destroy
    end

票:

    class Ticket < ActiveRecord::Base
      belongs_to :project
      belongs_to :user
      attr_accessible :description, :title
      validates :title, presence: true
      validates :description, presence: true, :length => { :minimum => 10 }
    end

和用户:

    class User < ActiveRecord::Base
      devise :database_authenticatable, :registerable, :confirmable,
             :recoverable, :rememberable, :trackable, :validatable
      attr_accessible :email, :password, :password_confirmation, :remember_me
    end

现在,当我将以下行添加到tickets_controller中的create动作时:

    @ticket = @project.tickets.build(params[:ticket].merge!(:user => current_user))

我收到此错误Can't mass-assign protected attributes: user。现在我真的不明白合并了什么!正在做和为什么:用户被传入或为什么我收到错误。我知道通常我必须将质量赋值属性包含在attr_accessible:方法中。但这次属性是一个类,所以我不知道如何处理它。

帮助, 麦克

2 个答案:

答案 0 :(得分:1)

将此添加到您的Ticket模型应该有效。您必须指定要在单个表单中使用的嵌套属性。

attr_accessible :description, :title, :user     
accepts_nested_attributes_for :questions

http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

答案 1 :(得分:0)

@ticket = @project.tickets.build(params[:ticket])
@ticket.user = current_user

除非你有理由在单行上需要这个吗?在哪种情况下可能

@ticket = @project.tickets.build(params[:ticket].merge!(:user_id => current_user.id))