開発マシンで問題なく動作するアプリがあります。Heroku にプッシュすると、アプリがクラッシュする原因となる次のエラーが表示されます。
ActiveRecord::AssociationTypeMismatch (Profile(#47183120) expected, got ActiveSupport::HashWithIndifferentAccess(#35109340))
ログから、これは次のとおりです。
153 <13>1 2012-06-04T00:07:57+00:00 app web.1 - - Started POST "/users" for 2.124.94.147/027c5e93.bb.sky.com at 2012-06-04 00:07:57 +0000
138 <13>1 2012-06-04T00:07:57+00:00 app web.1 - - Processing by RegistrationsController#create as HTML
517 <13>1 2012-06-04T00:07:57+00:00 app web.1 - - Parameters: {"utf8"=>"✓", "authenticity_token"=>"ztrHyRb/VzLSNRKZI1ifP6NZfdXFacDGi6edxM7RCRM=", "user"=>{"email"=>"user@email.com", "username"=>"user", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "profile"=>{"full_name"=>"Some Name", "birth_date(3i)"=>"21", "birth_date(2i)"=>"10", "birth_date(1i)"=>"1985", "gender"=>"0", "postcode"=>"XXXX XXX", "description"=>"Site designer."}}, "commit"=>"Sign up"}
129 <13>1 2012-06-04T00:07:57+00:00 app web.1 - - Completed 500 Internal Server Error in 84ms
86 <13>1 2012-06-04T00:07:57+00:00 app web.1 - -
211 <13>1 2012-06-04T00:07:57+00:00 app web.1 - - ActiveRecord::AssociationTypeMismatch (Profile(#47001900) expected, got ActiveSupport::HashWithIndifferentAccess(#29446440)):
ユーザーモデル (Devise から):
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
# FriendlyID for slugs
extend FriendlyId
friendly_id :username, use: :slugged
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :profile_attributes, :remember_me, :username
# attr_accessible :title, :body
# Set relationships
has_one :profile, dependent: :destroy
accepts_nested_attributes_for :profile
# Validation
VALID_USERNAME_REGEX = /^[a-z0-9_]+$/i
validates :username, presence: true, uniqueness: true, length: { minimum: 5, maximum: 15 }, format: { with: VALID_USERNAME_REGEX }
end
プロファイル モデル:
class Profile < ActiveRecord::Base
attr_accessible :birth_date, :description, :full_name, :gender, :latitude, :longitude, :postcode
belongs_to :user
geocoded_by :geocode_string
INVALID_NAME_REGEX = /^[^0-9`!@#\$%\^&*+_=]+$/
VALID_POSTCODE_REGEX = /^\s*((GIR\s*0AA)|((([A-PR-UWYZ][0-9]{1,2})|(([A-PR-UWYZ][A-HK-Y][0-9]{1,2})|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))))\s*[0-9][ABD-HJLNP-UW-Z]{2}))\s*$/i
validates :full_name, format: { with: INVALID_NAME_REGEX }, presence: true
validates :birth_date, timeliness: { before: :today, type: :date }, presence: true
validates :gender, presence: true
validates :postcode, format: { with: VALID_POSTCODE_REGEX }, allow_blank: true
validates :description, length: { maximum: 500 }
after_validation :geocode
private
def geocode_string
"#{postcode}"
end
end
新しいユーザー ビュー (ユーザー/登録):
<h2>Sign up</h2>
<% resource.build_profile %>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.label :username %> <i>(this cannot be changed so choose wisely)</i><br />
<%= f.text_field :username %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<%= f.fields_for resource.profile do |profile_form| %>
<div><%= profile_form.label :full_name %><br />
<%= profile_form.text_field :full_name %></div>
<div><%= profile_form.label :birth_date %><br />
<%= profile_form.date_select :birth_date, start_year: Time.now.year, end_year: Time.now.year - 80, order: [:day, :month, :year], prompt: { day: 'Choose day', month: 'Choose month', year: 'Choose year' } %></div>
<div><%= profile_form.label :gender %><br />
<%= profile_form.select :gender, { "Male" => '0', "Female" => '1' } %></div>
<div><%= profile_form.label :postcode %><br />
<%= profile_form.text_field :postcode %></div>
<div><%= profile_form.label :description, "About you" %><br />
<%= profile_form.text_area :description %></div>
<% end %>
<div><%= f.submit "Sign up" %></div>
<% end %>
<%= render :partial => "devise/shared/links" %>
登録コントローラーは、after_update_path の変更を除けば、すべての意図と目的において標準です。
class RegistrationsController < Devise::RegistrationsController
protected
def after_update_path_for(resource)
users_control_panel_path
end
end
これに関する他の投稿を見たことがありますが、それらは関連していないようです - 間違っていたら許してください。何が問題で、どうすれば解決できますか? これはローカルマシンでは実行されますが、Heroku では実行されないため、特に混乱しています (データベースを移行しました)。
編集:
申し訳ありませんが、私の開発マシンでは機能しません。この機能を追加しましたが、機能しなかったため、代わりにコンソールに詳細を追加し、再訪するのを忘れていました。