2015-11-20 38 views
1

在我的Rails 4的應用程序,我有一個CalendarPost機型,採用shallow路線:軌道4:自定義操作只更新PARAM與AJAX

resources :calendars do 
    resources :posts, shallow: true 
end 

日曆has_many後和後belong_to一個日曆。

我已經在show.html.erb視圖中使用的Posts#Update動作AJAX調用更新後的自定義:approval PARAM:在我Posts#Update控制器

  • respond_to do |format| format.js end
  • 我有一個update.js.erb查看在app/views/posts/重新加載相應部分的帖子show.html.erb查看
  • 當然,我的鏈接設置爲remote: true

現在,我需要實現類似的功能,更新後的定製:approval PARAM,但其中顯示的所有職位日曆show.html.erb視圖。

這是目前我已經在我的日曆show.html.erb觀點:

<td class="cell_content_center post_approval_section"> 
    <% if post.approval == "ok" %> 
    <span class="ok_green"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "ok"), remote: true, :method => :patch do %> 
     <span class="glyphicon glyphicon-ok" data-toggle="tooltip" data-placement="left" title="Approve Post"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "edit" %> 
    <span class="edit_yellow"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "edit"), remote: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-repeat" data-toggle="tooltip" data-placement="left" title="Require Edits"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "remove" %> 
    <span class="remove_red"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "remove"), remote: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-remove" data-toggle="tooltip" data-placement="left" title="To Be Deleted"></span> 
    <% end %> 
    </span> 
</td> 

此代碼可以讓我真正從日曆show.html.erb更新後的自定義:approval PARAM。

但我不知道如何重新加載頁面,甚至更好,只需重新加載鏈接所在的post_approval_sectiontd

我不能再用我的show.html.erb使用完全相同的方法,因爲我已經爲Posts#Update行動建立一個JS響應。

我該如何做這項工作?

-----

UPDATE:基於長阮答案,這裏是我現在在哪兒。

#calendars/show.html.erb and calendars/_post_approval.html.erb 

<td class="cell_content_center post_approval_section"> 
    <% if post.approval == "ok" %> 
    <span class="ok_green"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "ok"), remote: true, approval_update: true, :method => :patch do %> 
     <span class="glyphicon glyphicon-ok" data-toggle="tooltip" data-placement="left" title="Approve Post"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "edit" %> 
    <span class="edit_yellow"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "edit"), remote: true, approval_update: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-repeat" data-toggle="tooltip" data-placement="left" title="Require Edits"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "remove" %> 
    <span class="remove_red"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "remove"), remote: true, approval_update: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-remove" data-toggle="tooltip" data-placement="left" title="To Be Deleted"></span> 
    <% end %> 
    </span> 
</td> 

#posts_controller.rb 

def update 
    if params["approval_update"] 
     respond_to do |format| 
     format.js { render :action => "update_post_approval" } 
     end 
    else 
     respond_to do |format| 
     if @post.update(post_params) 
      format.html { redirect_to post_path(@post) } 
      format.json { render :show, status: :ok, location: @post } 
      format.js 
     else 
      format.html { render :edit } 
      format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
     end 
    end 
    end 

    def update_post_approval 
    respond_to do |format| 
     format.js 
    end 
    end 

#update_post_approval.js.erb 

$('td.post_approval_section').html('<%= j render(partial: "calendars/post_approval") %>'); 

當我點擊其中一個鏈接更新後批准,瀏覽器中沒有任何反應。

但是,log/development.log,我有:

Started PATCH "/posts/42?post%5Bapproval%5D=edit" for ::1 at 2015-11-19 19:59:51 -0800 
Processing by PostsController#update as JS 
    Parameters: {"post"=>{"approval"=>"edit"}, "id"=>"42"} 
    [1m[36mUser Load (1.1ms)[0m [1mSELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1[0m [["id", 1]] 
    [1m[35mPost Load (2.2ms)[0m SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1 [["id", 42]] 
    [1m[36m (1.1ms)[0m [1mBEGIN[0m 
    [1m[35mSQL (1.1ms)[0m UPDATE "posts" SET "approval" = $1, "updated_at" = $2 WHERE "posts"."id" = $3 [["approval", "edit"], ["updated_at", "2015-11-20 03:59:51.203371"], ["id", 42]] 
    [1m[36mSQL (3.6ms)[0m [1mINSERT INTO "versions" ("event", "object", "whodunnit", "created_at", "object_changes", "item_id", "item_type") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"[0m [["event", "update"], ["object", "---\nid: 42\ncalendar_id: 8\ndate: 2015-11-19 20:19:00.000000000 Z\nsubject: Armistice 2\nformat: Image\ncopy: Joyeux 11 novembre tout le monde. ++\ncreated_at: 2015-11-19 20:19:58.244685000 Z\nupdated_at: 2015-11-20 03:59:44.073894000 Z\nimage_file_name: armistice.jpg\nimage_content_type: image/jpeg\nimage_file_size: 35967\nimage_updated_at: 2015-11-19 20:19:57.792047000 Z\nshort_copy: etg'tg' <<\nscore: \nfacebook: true\ntwitter: true\ninstagram: false\npinterest: false\ngoogle: false\nlinkedin: false\ntumblr: \nsnapchat: \napproval: ok\n"], ["whodunnit", "1"], ["created_at", "2015-11-20 03:59:51.203371"], ["object_changes", "---\napproval:\n- ok\n- edit\nupdated_at:\n- 2015-11-20 03:59:44.073894000 Z\n- 2015-11-20 03:59:51.203371000 Z\n"], ["item_id", 42], ["item_type", "Post"]] 
    [1m[35m (2.0ms)[0m COMMIT 
    Rendered posts/_approval.html.erb (0.6ms) 
    Rendered posts/update.js.erb (2.1ms) 
Completed 200 OK in 59ms (Views: 10.9ms | ActiveRecord: 11.1ms) 

我在做什麼錯在這裏?

-----

回答

1

我拿出2層的思想來處理這種情況:

第一種方式:過程,當你從日曆show.html.erb更新帖子在另一個PARAM,所以link_to將是:

<%= link_to post_path(:id => post.id, "post[approval]" => "remove", approval_update: true), remote: true, :method => :patch do %> 

然後在你的郵政控制器上update動作,你可以過濾這個請求approval_update param:

現在210
if params["approval_update"] 
    respond_to do |format| 
    format.js { render :action => "update_post_approval" } 
    end 
else 
    respond_to do |format| 
    ... 
    end 
end 

當你從日曆 show.html.erb更新後,郵政控制器將加載RAILS_ROOT/app/views/posts/update_post_approval.js.erb,而不是update.js.erb

方式二:創建更新的另一條路線後批准屬性,這意味着您還將在Post控件中創建另一個動作,以處理日曆頁面中AJAX更新的情況。

+0

非常感謝。我正在嘗試**第一種方式**。有沒有辦法可以選擇在Posts#Update控制器中調用哪個.js.erb文件? –

+0

感謝您的加入。然後,我猜,在'update_post_approval.js.erb'中,我重新加載了與類post_approval_section相對應的div的部分,究竟是什麼?另外,我是否需要爲新的'update_post_approval'創建一個新路線? –

+0

是的,您可以通過'.js.erb'輕鬆操作DOM。 –

0

我想你應該能夠做到這一點與條件在js。ERB:

<% if @post.approval === 'ok' %> 
    $('td.post_approval_section').replaceWith("<%= j render(:partial => 'calendar/approval') %>"); 
<% else %> 
// you current update post code 
<% end %> 

與移動代碼一起_approval.html.erb

<% if post.approval == "ok" %> 
    <span class="ok_green"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "ok"), remote: true, :method => :patch do %> 
     <span class="glyphicon glyphicon-ok" data-toggle="tooltip" data-placement="left" title="Approve Post"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "edit" %> 
    <span class="edit_yellow"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "edit"), remote: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-repeat" data-toggle="tooltip" data-placement="left" title="Require Edits"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "remove" %> 
    <span class="remove_red"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "remove"), remote: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-remove" data-toggle="tooltip" data-placement="left" title="To Be Deleted"></span> 
    <% end %> 
    </span> 

希望有所幫助。

+0

感謝您的回答,這對於有經驗的人來說是必須有意義的。由於我是新手,我不得不說我很困惑。我在'app/views/posts'中已經有'_approval.html.erb'文件。另外,什麼代碼應該去你說'//你當前更新郵政編碼'? –