Activity モデルの検証があり、これは activities_controller の作成アクションです。検証を満たさずにモデルを保存しようとすると、余分なアクティビティ インスタンスが作成されます。検証に失敗したアクティビティが作成されるのはなぜですか?
def create
@activity_last = Activity.find(params[:activity_id])
@activity = @activity_last.dup
@activity.activity_date = Time.now
respond_to do |format|
if @activity.update_attributes(params[:activity])
format.html { redirect_to @activity.tenant, notice: 'Activity was successfully created.' }
format.json { render json: @activity.tenant, status: :created, location: @activity.tenant }
else
format.html { render action: "new" }
format.json { render json: @activity.errors, status: :unprocessable_entity }
end
end
end
ここで dup を使用する理由は、最新のアクティビティの複製を作成し、その属性のサブセットをパラメーターから更新するためです。説明のために、Activity には 10 個の属性があるとします。ユーザーは、これらの属性のうち 3 つのフィールドを持つフォームに移動します。次に、ユーザーによって更新されていない属性の最新のアクティビティと同じ属性値を持つ新しいアクティビティを作成したいと考えています。
- アップデート -
なぜこれが起こっていたのかを明らかにしました。上記のコードを短くして混乱を減らしましたが、その短縮の一環として、次の行を切り取りました。
@comment = Comment.new(params[:comment])
@comment.user = current_user
@comment.activity = @activity
@comment.save!
アクティビティの保存後にコメントの保存を移動すると、アプリは正しく動作します。保存されていないアクティビティにリンクされているコメントを保存すると、アクティビティが保存されるのではないでしょうか?