1 対 1 の関連付けを持つ 2 つのモデル (ユーザーとプロファイル) があります。
class Profile < ActiveRecord::Base
attr_accessible :language_tokens, :tele, :languages, :serviceDesc, :service
belongs_to :user
...
class User < ActiveRecord::Base
has_one :profile, dependent: :destroy
プロファイルは以下を使用して構築されます。
@profile = @user.build_profile(session[:form_params])
私のプロファイル編集フォームは、送信時にプロファイル更新アクションにルーティングされる標準フォームです。
<%= form_for @profile do |f| %>
<%= render 'shared/host_information', :f => f%>
<%= render 'shared/service_information', :f => f%>
<%= f.submit 'done', class: "bnt"%>
<% end %>
HTML form:
<form id="edit_profile_6" class="edit_profile" method="post" action="/profiles/6" accept-charset="UTF-8">
ただし、何らかの奇妙な理由で、予期されたプロファイルの更新ではなく、ユーザーの更新にフォームが送信されています。ユーザー アップデートにデバッグ ポイントを追加したところ、ターゲット コントローラーが実際に profile_controller であることを params が確認していることがわかります。
/railsapp/loco_app/app/controllers/users_controller.rb:82
@user = User.find_by_id(params[:id])
(rdb:15) p params
{"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"qXx5EWwIWASiARKVFE7eDd43gHnBSmK538YAXeesDyI=", "profile"=>{"country_id"=>"8", "city_id"=>"22", "tele"=>"", "language_tokens"=>"18,14", "service"=>"9", },
"commit"=>"done", "action"=>"update", "controller"=>"profiles", "id"=>"6"}
(rdb:15)
関連するルートは次のとおりです。
profiles POST /profiles(.:format) profiles#create
new_profile GET /profiles/new(.:format) profiles#new
edit_profile GET /profiles/:id/edit(.:format) profiles#edit
profile PUT /profiles/:id(.:format) profiles#update
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
この問題をデバッグする最善の方法は何ですか? これは 1 対 1 の関連付けの奇妙な副作用ですか、それともバグですか? Rails 3.2.2 を使用しています。
* UPDATE * したがって、これは間違いなくバグのように見えます。コントローラー (同じ名前) を再生成し、同じコードをコピーしたところ、他の変更を加えることなく動作するようになりました。これが既知の問題であるかどうか、および将来このような問題をデバッグする方法を知りたいと思っています。