1 つのサインインおよびサインアウト インターフェイスを提供するが、サインアップするモデルに応じて複数のサインアップ インターフェイスを提供するデバイスを使用してアプリを構築しようとしています。したがって、さまざまなモデルに個別のテーブルを用意したいので、私のニーズに非常によく適合するポリモーフィックな関連付けに出会いました。
しかし、基本ユーザー モデルの属性で常に何らかのエラーが発生するため、ユーザーをサインアップできません。https://stackoverflow.com/a/11956734/1183192とhttps://stackoverflow.com/a/15459313/1183192を読みましたが、すべてを適応させたと思います。
基本ユーザー モデル:
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me, :role_id, :role_type,
:salutation, :firstname, :lastname, :street, :zipcode, :city, :phone
belongs_to :role, polymorphic: true
def customer?
'Customer' == self.role_type
end
def customer
Customer.find(self.role_id) if self.customer?
end
def admin?
'Admin' == self.role_type
end
def admin
Admin.find(self.role_id) if self.admin?
end
end
顧客モデル:
class Customer < ActiveRecord::Base
has_one :user, as: :role
attr_accessible :user_attributes
accepts_nested_attributes_for :user
end
顧客コントローラー:
class CustomersController < ApplicationController
# removed all methods except new and create
def new
@customer = Customer.new
@customer.build_user
respond_to do |format|
format.html # new.html.erb
format.json { render json: @customer }
end
end
def create
@customer = Customer.new(params[:customer])
respond_to do |format|
if @customer.save
format.html { redirect_to @customer, notice: 'Customer was successfully created.' }
format.json { render json: @customer, status: :created, location: @customer }
else
format.html { render action: "new" }
format.json { render json: @customer.errors, status: :unprocessable_entity }
end
end
end
end
ビュー (new.html.erb):
<h1>New customer</h1>
<%= form_for @customer do |f| %>
<%= f.fields_for @customer.user do |u| %>
<div class="row">
<div class="small-12 large-12 columns">
<%= u.label :email %>
<%= u.email_field :email, required: true, autofocus: true %>
</div>
</div>
<div class="row">
<div class="small-12 large-12 columns">
<%= u.label :password %>
<%= u.password_field :password, required: true %>
</div>
</div>
<div class="row">
<div class="small-12 large-12 columns">
<%= u.label :password_confirmation %>
<%= u.password_field :password_confirmation, required: true %>
</div>
</div>
<div class="row">
<div class="small-12 large-12 columns">
<%= u.label :salutation %>
<%= u.text_field :salutation %>
</div>
</div>
<div class="row">
<div class="small-12 large-12 columns">
<%= u.label :firstname %>
<%= u.text_field :firstname %>
</div>
</div>
<div class="row">
<div class="small-12 large-12 columns">
<%= u.label :lastname %>
<%= u.text_field :lastname %>
</div>
</div>
<div class="row">
<div class="small-12 large-12 columns">
<%= u.label :street %>
<%= u.text_field :street %>
</div>
</div>
<div class="row">
<div class="small-12 large-12 columns">
<%= u.label :zipcode %>
<%= u.text_field :zipcode %>
</div>
</div>
<div class="row">
<div class="small-12 large-12 columns">
<%= u.label :city %>
<%= u.text_field :city %>
</div>
</div>
<div class="row">
<div class="small-12 large-12 columns">
<%= u.label :phone %>
<%= u.text_field :phone %>
</div>
</div>
<% end %>
<%= f.submit class: "button success" %>
<% end %>
新しいページは正しく表示されますが、送信しようとすると次のエラーが発生します。
ActiveModel::MassAssignmentSecurity::Error in CustomersController#create
Can't mass-assign protected attributes: user
パラメータは次のとおりです。
{"utf8"=>"✓",
"authenticity_token"=>"WngmLBR7MmVuhDyYxsASWQscUTB/VFmKmn/fdatVB30=",
"customer"=>{"user"=>{"email"=>"max@mustermann.com",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"salutation"=>"",
"firstname"=>"Max",
"lastname"=>"Mustermann",
"street"=>"Musterstraße 1",
"zipcode"=>"12345",
"city"=>"Musterstadt",
"phone"=>"4917620289872"}},
"commit"=>"Create Customer"}
エラーは Customer クラスにあると思いますが、修正方法がわかりません。
アップデート
顧客モデルに変更を加えました。
class Customer < ActiveRecord::Base
has_one :user, as: :role
attr_accessible :user # :user instead of :user_attributes
accepts_nested_attributes_for :user
end
次のエラーが表示されます。
ActiveRecord::AssociationTypeMismatch in CustomersController#create
User(#70271634657140) expected, got ActiveSupport::HashWithIndifferentAccess(#70271609254480)
app/controllers/customers_controller.rb:44:in `new'
app/controllers/customers_controller.rb:44:in `create'