2016-04-23 14 views
0

@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 %> 
+0

あなたの 'update'メソッドと' form'を投稿することができます – 7urkm3n

+0

これを実行して正確に何を達成しようとしていますか教えてください。何か変更があった場合、更新後に何かしたいのですか? – Alfie

+0

私は、両方のリクエストに答える情報を追加しました。 –

答えて

0

あなたがしようとしているように思え更新中に変更があった場合は何かを達成してください。

そのような場合、あなたはこのような何か行うことができます:

あなたがself.changesを確認するかself.changed?場合は、期待どおりの結果を得るだろう、モデル用とコールバック内で、必要に応じてafter_saveまたはafter_updateコールバックを使用します。

+0

申し訳ありませんが、私の悪い。もう一度チェックしてみましょう – Alfie

+0

'update'の代わりに' update_attributes'を使ってみることができます – Alfie

+0

@BillyBlobSnortinもう一度やります。解決策については私の最新の回答をご覧ください。 – Alfie

関連する問題