RailsCast、別のネストされた属性のビデオ、多くの SO 投稿を見て、しばらくこれと格闘しましたが、まだ理解できません。それが小さなものであることを願っています。
User
(Devise によって作成された) と(別名、製品のウィッシュ リスト) の2 つのモデルがあり、彼らがサインアップするときにLocker
を作成しようとしています。私のログインフォームには、新しいユーザー登録時に作成されるロッカーに割り当てようとしている新しい(適切に呼ばれる) の名前のフィールドがあります。私がこれまでに迎えたのは次のとおりです。Locker
User
Locker
:name
WARNING: Can't mass-assign protected attributes: locker
accepts_nested_attributes
との両方のモデルのすべての組み合わせを試しましたがattr_accesible
、まだ何も機能しません。Devise#create メソッドによって処理されていることをログから確認できます。また、Devise が私のモデルを思いどおりに作成できるほど賢くないこともわかっています :)
私の2つのモデルの関連部分は次のとおりです。
# user.rb
class User < ActiveRecord::Base
attr_accessible :username, :email, :password, :password_confirmation, :remember_me, :locker_attributes
# Associations
has_many :lockers
has_many :lockups, :through => :lockers
# Model nesting access
accepts_nested_attributes_for :lockers
end
と
# locker.rb
class Locker < ActiveRecord::Base
belongs_to :user
has_many :lockups
has_many :products, :through => :lockups
attr_accessible :name, :description
end
# lockers_controller.rb (create)
@locker = current_user.lockers.build(params[:locker])
@locker.save
どうにかしてこれを機能させるには、 Devise のcreate
メソッドをオーバーライドする必要があると思いますが、私はレールにまったく慣れておらず、すべてのブラック ボックスの「魔法」の性質に慣れてきています。
誰かが私を助けることができれば、私は信じられないほど感謝しています. そのままでは、すでにこれに多くの時間を費やしています:)
編集:私は自分の問題で何かを省略したことに気付きました。私のLocker
モデルにはname
、 、description
(必須ではありません)、およびuser_id
にリンクするための3 つの属性がありUser
ます。私のサインアップ フォームは のみを必要とするname
ため、ネストされたフォームのすべての属性をループするわけではありません。それも私の問題と関係があるのでしょうか?
EDIT 2: DeviseのRegistrationsController#create
メソッドをオーバーライドする方法もわかりましたが、そこに何を置くべきかわかりません。Devise の全体像resource
は私には理解できません。また、Devise のソース コードを参照してRegistrationsController
もあまり役に立ちませんでした。
ボーナス ポイント:ユーザーが無効なデータを含むログイン フォームを送信すると、Locker
フィールドは常に空白に戻りますが、Devise の通常のフィールドであるユーザー名と電子メールには入力されます。これも簡単に修正できますか? もしそうなら、どのように?