を含むモデルで Active Record コールバックに問題があります。accepts_nested_attributes
build_associated_parties
コールバックを使用して呼び出しafter_create
ますが、これらの値が保存されず、<nil>
エラーが発生します。before_create
&コールバックも使用してみましたが、after_initialize
成功しませんでした。
コールバックが失敗する原因は何ですか?
接続.rb
class Connection < ActiveRecord::Base
attr_accessible :reason, :established, :connector, :connectee1,
:connectee2, :connectee1_attributes,
:connectee2_attributes, :connector_attributes
belongs_to :connector, class_name: "User"
belongs_to :connectee1, class_name: "User"
belongs_to :connectee2, class_name: "User"
accepts_nested_attributes_for :connector, :connectee1, :connectee2
belongs_to :permission
after_create :build_associated_parties
# builds connectee's, connector, permission objects
def build_associated_parties
build_connector
build_connectee1
build_connectee2
build_permission
end
connection_controller.rb
class ConnectionsController < ApplicationController
def new
@connection = Connection.new
end
def create
@connection = Connection.new params[:connection]
if @connection.save
flash[:notice] = "Connection created successfully!"
redirect_to @connection
else
render :new
end
end
end
ただし、代わりに、以下に示すようにこれらの属性をコントローラー内に作成すると、エラーは発生しません。これは素晴らしいことですが、ビジネス ロジック コードをコントローラーから除外することには反対のようです。
class ConnectionsController < ApplicationController
def new
@connection = Connection.new
@connection.build_connectee1
@connection.build_connectee2
@connection.build_connector
end
end
モデル内のコードで同じ機能を実現するにはどうすればよいですか? モデルに保持する利点はありますか?