2015-11-14 46 views
0

在我的Rails應用4,我有一個calendarpost模型:一個calendarhas_manypost S和postbelong_to一個calendar軌道4:在的link_to助手設置自定義redirect_to的遠程:真正

Calendars#Show中,我顯示屬於此calendar的所有post

在這個非常相同的觀點,我使用下面的鏈接到update一個postapproval自定義屬性:

<%= link_to post_path(:id => @post.id, "post[approval]" => "ok"), :method => :patch %> 

問題,當我點擊這個鏈接,我被帶到了Posts#Show查看這篇文章的。

我想反而是保持在同一Calendars#Show視圖。

我想實現我的控制器Posts#Update行動redirect_to :back的,但是這是不可能的,因爲這將我重定向到Posts#Edit視圖,當我更新來自這同一個Posts#Edit視圖一個職位。

因此,我正在尋找一種解決方案,專門爲我的link_to幫手執行redirect_to,將remote: trueCalendars#Show更改爲Calendars#Show

這可能嗎?

回答

1

remote: true

如果您使用remote(代碼段做不是有),你不會無論如何被重定向:

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

remote: true功能調用ajax,這是一個XML調用(通過JS)到您的服務器。憑藉在呼叫被淘汰的「範圍」(IE不是一個標準的「請求」)的,它不會對你自己觸發他們的任何更改當前的瀏覽器狀態,除非

#app/controllers/posts_controller.rb 
class PostsController < ApplicationController 
    def update 
     @post = Post.find params[:id] 
     respond_to do |format| 
     if @post.update 
      format.json #-> fired only when json is datatype 
      format.js #-> invokes app/views/posts/update.js.erb 
      format.html { redirect_to @post } #-> only fires on http request 
     end 
     end 
    end 
end 

#app/views/posts/update.js.erb 
## do what you want here 

Calendars#ShowCalendars#Show

如果你想刷新頁面,你可以使用:

#app/views/posts/update.js.erb 
window.location.reload(true); 

-

給你一些更多的上下文,AJAX代表一個 synrhconous Ĵ avascript 一個第二X毫升。這意味着您發送的每個請求都被認爲是asynchronous - 或超出了「正常」HTTP請求的範圍。

enter image description here

Ajax請求是意味着被用來更改/更新應用到已加載的頁面。一個很好的例子是聊天系統或其他東西。

在Ajax響應後,如何重定向雖然沒有錯,但它的工作方式絕對違背了它的約定。如果你想創建你正試圖重定向,我會強烈建議使用標準的HTTP請求在你採取行動的一些條件:

#app/controllers/posts_controller.rb 
class PostsController < ApplicationController 
    def update 
     @post = Post.find params[:id] 
     @post.update post_params 
     redirect_to posts_path if @post.approved.changed? 
     redirect_to root_path if .... 
    end 
end 
+0

非常感謝你爲你的準確和完整的答案,大加讚賞。你是對的,當我想在AJAX響應之後重定向時,我有點錯過了這一點。我真正想做的是更新我的頁面的特定部分,一旦鏈接被點擊,並基於點擊數據庫中的新值。所以,我想我需要使用這個'update.js.erb'文件。 –

0

由於這是一個AJAX請求,在安置自己的控制器,你需要給JS迴應:

def update 
    # ... 
    respond_to do |format| 
    if @post.update(post_params) 
     format.js { head :ok } # see here no redirects 
     # ... other formats 
    else 
     # ... 
    end 
    end 
end