@project.update
の属性が変更されたかどうかに応じて、条件付きでビューの一部を表示/非表示したいとします。アトリビュートが正常に更新された後に、モデルインスタンスが変更されたとフラグされない
属性の更新が正常に完了した後、モデルインスタンスに変更が加えられていないことを理解しようとしています。
ActiveModel::Dirty
は、私のモデルの属性が変更されていることを正しく示していないか、正しく使用していない可能性があります。
ここに私がProjectController#update
のアクションにしたPATCH
リクエストの注釈付きログがあります。その中で、属性は変わってもモデルインスタンスはそれを反映していないことがわかります。それが価値あるものであれば、コントローラはRailsの足場操作によって生成されました。普通のことは何もありません。ここで
#
# FORM SUBMITTED FROM BROWSER WITH A CHANGE TO THE ATTRIBUTE NAMED "title"
#
Started PATCH "/projects/2" for 127.0.0.1 at 2016-04-23 15:47:38 -0700
Processing by ProjectsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"0JH/fEKx+Qk6mOY+eVTteKQUKrZUVXroKzMxuztrTzE/voI+PtzmQnJLGVM5bgdmzJyHDpAon3dzcvvjJ3yEtQ==", "project"=>{"title"=>"changed"}, "commit"=>"Update Project", "id"=>"2"}
Project Load (0.1ms) SELECT "projects".* FROM "projects" WHERE "projects"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]]
#
# DEBUGGER KICKS IN BEFORE THE UPDATE HAS HAPPENED
#
[40, 49] in app/controllers/projects_controller.rb
40:
41: # PATCH/PUT /projects/1
42: # PATCH/PUT /projects/1.json
43: def update
44: byebug
=> 45: respond_to do |format|
46: if @project.update(project_params)
47: format.html { redirect_to @project, notice: 'Project was successfully updated.' }
48: format.json { render :show, status: :ok, location: @project }
49: else
#
# PROJECT TITLE IS STILL UNMOLESTED
#
(byebug) @project
<Project id: 2, title: "ORIGINAL_TITLE", created_at: "2016-04-23 22:47:30", updated_at: "2016-04-23 22:47:30">
# PROVE PARAMS CONTAIN A CHANGED ATTRIBUTE
(byebug) project_params
<ActionController::Parameters {"title"=>"changed"} permitted: true>
#
# TRIGGER UPDATE AND PERSIST NEW TITLE
#
(byebug) @project.update(project_params)
(0.2ms) begin transaction
SQL (0.9ms) UPDATE "projects" SET "title" = ?, "updated_at" = ? WHERE "projects"."id" = ? [["title", "changed"], ["updated_at", 2016-04-23 22:48:13 UTC], ["id", 2]]
(3.5ms) commit transaction
true
#
# WAT?
#
(byebug) @project.changes
{}
(byebug) @project.changed?
false
(bye bug)
私ProjectsController#update
アクション(標準Railsは足場)である:(また、生成された足場から)
# app/controllers/projects_controller.rb
# PATCH/PUT /projects/1
# PATCH/PUT /projects/1.json
def update
byebug
respond_to do |format|
if @project.update(project_params)
format.html { redirect_to @project, notice: 'Project was successfully updated.' }
format.json { render :show, status: :ok, location: @project }
else
format.html { render :edit }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
対応するビュー形式:
# app/views/projects/_form.html.erb
<%= form_for(project) do |f| %>
<% if project.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(project.errors.count, "error") %> prohibited this project from being saved:</h2>
<ul>
<% project.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :title %>
<%= f.text_field :title %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
あなたの 'update'メソッドと' form'を投稿することができます – 7urkm3n
これを実行して正確に何を達成しようとしていますか教えてください。何か変更があった場合、更新後に何かしたいのですか? – Alfie
私は、両方のリクエストに答える情報を追加しました。 –