これは本当に私を失望させています!:(
ユーザー モデルのネストされたモデル フォームを作成しようとしています。その中にチェックボックス リストがあり、複数のストアをチェックまたはチェック解除して、モデル スタッフィングを通じてストアを管理できます。
class Staffing < ActiveRecord::Base
# Associations
belongs_to :user
belongs_to :staffable, :polymorphic => true
belongs_to :store, :class_name => "Store",
:foreign_key => "staffable_id"
end
class User < ActiveRecord::Base
# Includes
acts_as_authentic
# Associations
has_many :staffings, :dependent => :destroy
has_many :stores, :through => :staffings
# Nested Attributes
accepts_nested_attributes_for :staffings, :allow_destroy => true
end
class Store < ActiveRecord::Base
# Associations
has_many :staffings, :as => :staffable, :dependent => :destroy
has_many :users, :through => :staffings
end
# Users Controller
def create
@user = User.new(params[:user])
flash.now[:notice] = "#{@user.name} was successfully created." if @user.save
respond_with @user
end
def update
@user = User.find(params[:id])
params[:user][:store_ids] ||= []
@user.update_attributes(params[:user])
flash.now[:notice] = "#{@user.name} was successfully updated."
respond_with @user
end
当面の目的では、他のスタッフ可能な関連付けは無視できます。これは、最終的に Store と一緒に管理したいと考えている同様のモデルですが、このままでは困惑するので、まず第一に考えることです。
# User Form
- for store in Store.all
%p
= check_box_tag "user[store_ids][]", store.id, @user.stores.include?(store)
= store.nickname
私のパラメータを次のように送信します。
{"utf8"=>"✓",
"authenticity_token"=>"blub-blub-blub=",
"user"=>{"login"=>"hey.buddy",
"email"=>"test@hey.net",
"role"=>"admin",
"hq"=>"1",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"store_ids"=>["3",
"4"]}}
そしてエラー!
Mysql2::Error: Column 'staffable_type' cannot be null: INSERT INTO `staffings` (`created_at`, `staffable_id`, `staffable_type`, `updated_at`, `user_id`) VALUES ('2010-11-17 00:30:24', 3, NULL, '2010-11-17 00:30:24', 102)
staffable_type を 'Store' として作成する必要があることはわかっていますが、一日中試してみました。
staffable_type (および id) 列を :null => false に設定していますが、DB にアクセスする前にコントローラーでこれを調整する必要があるため、これが原因ではありません。
私の作成アクションで以下が機能しないのはなぜですか:
@user.staffings.each do |s|
s.staffable_type = 'Store'
end
また:
@user.store_ids.each do |i|
s = @user.staffings.build
s.staffable_type = 'Store'
s.staffable_id = i
end
上記に似た多くのことを試しても無駄です。どんな助けでも大歓迎です。
御時間ありがとうございます!