0

私は現在 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

ticket_controller 内の create アクションに次の行を追加すると、次のようになります。

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

このエラーが発生しますCan't mass-assign protected attributes: user。今、私は何のマージがよくわかりません! やっている理由と、:userが渡されている理由、またはエラーが発生している理由。通常、attr_accessible: メソッドに mass-assignment 属性を含める必要があることはわかっています。しかし、今回は属性がクラスなので、これを処理する方法がわかりません。

助けて、マイク

4

2 に答える 2

1

これをチケットモデルに追加するとうまくいくはずです。単一のフォームで使用するために受け入れるネストされた属性を指定する必要があります。

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

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

于 2012-05-23T20:47:28.803 に答える
0
@ticket = @project.tickets.build(params[:ticket])
@ticket.user = current_user

1行でこれが必要な理由がない限り? その場合多分

@ticket = @project.tickets.build(params[:ticket].merge!(:user_id => current_user.id))
于 2012-05-23T21:11:54.100 に答える