フォームにhidden_fieldを作成する代わりに、paramsを変更してユーザーを設定しています。私が理解している限り、これは一括割り当てを処理するためのより安全な方法です。
def update
@exercise = Exercise.find(params[:id])
#this is the important part
if params[:exercise][:log_entries_attributes].present?
params[:exercise][:log_entries_attributes].each do |value|
value[1].merge!(:user_id => current_user.id)
end
end
#end the important part
respond_to do |format|
if @exercise.update_attributes(params[:exercise])
format.html { redirect_to_back_or_default @exercise, notice: "Exercise was successfully updated." }
format.mobile { redirect_to @exercise, notice: 'Exercise was successfully updated.' }
format.json { head :ok }
else
format.html { render action: "edit" }
format.mobile { redirect_to @exercise, notice: "#{@exercise.errors.full_messages.to_sentence}" }
format.json { render json: @exercise.errors, status: :unprocessable_entity }
end
end
end
私の仕様では、次のものがあります。
describe "with log_entry_attributes" do
it "updates log_entries_attributes and sets user" do
exercise = FactoryGirl.create(:exercise)
log_entry = FactoryGirl.build(:log_entry)
exercise.log_entries << log_entry
exercise.save
controller.stub(:current_user).and_return(@user)
put :update, :id => exercise.id, :exercise => FactoryGirl.build(:exercise, "log_entries_attributes" => {":0" => {"reps" => "5", "weight" => "5"}}).attributes.symbolize_keys
assigns(:exercise).log_entries.first.user.should eq(@user)
end
end
取得しundefined method user for nil:NilClass
ます。未定義のメソッドuserを取得する理由はわかっていると思います。割り当てを介して関連付けを取得する方法はありません。user_idがcurrent_userを介して正しく設定されていることをテストする方法がわかりません。何か助けはありますか?