簡體   English   中英

Rails 4:在具有遠程控制的link_to幫助器中設置自定義redirect_to

[英]Rails 4: setup custom redirect_to in link_to helper with remote: true

在我的Rails 4應用程序中,我有一個calendar和一個post模型: calendar has_many post s和一個post belong_to calendar

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時,這會將我重定向到Posts#Edit視圖。

因此,我正在尋找一種解決方案,以實現專門針對帶有remote: true我的link_to幫助remote: true的redirect_to remote: trueCalendars#ShowCalendars#Show

那可能嗎?

帶有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毫升。 這意味着您發送的每個請求都被認為是異步的 ,或者超出了“正常” HTTP請求的范圍。

在此處輸入圖片說明

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

由於這是一個AJAX請求,因此在Post控制器中,您需要響應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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM