2012-04-01 127 views
9

後,我已經有了一個形式與遠程=>真。 而現在我的控制器看起來像:重定向到成功的Ajax形式

# POST /items 
    # POST /items.json 
    def create 
    @item = @store.items.build(params[:item]) 

    respond_to do |format| 
     if @item.save 
     format.html { redirect_to edit_admin_item_path(@item), :flash => {:success => "#{@item.name} was successfully created."} } 
     format.js { render :js => "window.location.href = ('#{edit_admin_item_path(@item)}');"} 
     format.json { render json: @item, status: :created, location: @item } 
     else 
     format.html { render action: "new" } 
     format.js { render :partial => 'fail_create.js.erb', :locals => { :ajax_errors => @item.errors.full_messages } } 
     format.json { render json: @item.errors, status: :unprocessable_entity }  
     end 
    end 
    end 

哪些工作,但感覺很笨拙。它也不允許我使用閃光燈通知,這確實是悲傷的時刻。

理想我覺得我應該能夠簡單地用「format.js {redirect_to的...}或覈對請求頭和redirect_to的。嘖!

我不知道最好的解決辦法是什麼。任何建議將超級真棒,在此先感謝!

-PS-我知道這已被問過一些之前,但無濟於事:How to redirect after a successful AJAX form submission。似乎有許多問題相似的浮動,但沒有真正的解決方案。

+0

也許我錯過了一些東西,但不是它提交的AJAX表單的全部觀點,它*不*需要頁面加載?如果你打算重定向,那麼你是否可以做一個老式的提交? – jimw 2012-04-11 23:52:08

+0

ajax用於檢查驗證和重複記錄。然後用錯誤信息更新。 當表單成功時,我想要重定向到edit_path。其中有圖像上傳和其他事情正在進行。 – Galaxy 2012-04-12 06:46:44

+0

沒錯,但是你可以在沒有AJAX提交的情況下做JS表單驗證。我知道通過AJAX提交的唯一原因是爲了避免頁面加載。 – jimw 2012-04-12 09:03:07

回答

5

我想這可能是不可能的。 XMLHttpRequest處理對Ajax請求的響應。如果返回3xx響應,則XMLHttpRequest將遵循重定向本身,如果URL具有相同的來源。無論您如何設置標題,瀏覽器都不會意識到這一點。所以唯一的方法可能是用一些Javascript來改變window.location。

+0

設置標題是我原來想要做的。似乎不能完成! – Galaxy 2012-04-08 22:47:07

+2

設置標題不是Rails方式;因此,我不會推薦走這條路。 – 2012-04-12 14:04:44

+0

這麼晚了,我正在使用'make_resourceful',但無法在'create'之後將用戶重定向到正確的位置,因爲它沒有進入'response_for(:create)do | format |'熄滅。 任何示例控制器代碼? @AaronGray – LearningROR 2016-08-30 23:02:09

3

我用的Rails responders組合來產生我的響應消息和一些conten t在我的<action>.js文件中。

的內容 - 比如update.js會是這個樣子:

// Checks if the article slug has changed. 
// If it has the entire page should be reloaded at that new location. 
<%= reload_if_slug_changed @article, params[:id] %> 

// Displays the flash notices 
// See ApplicationHelper#js_flash_response 
<%= js_flash_response %> 

,其中不同的方法在一些輔助定義(在我的情況我ApplicationHelper)。的不同方法的內容如下:

def js_flash_response 
    if flash.now[:notice].present? 
    js = "$('#notice').html('#{flash.now[:notice]}').change();" 
    elsif flash.now[:alert].present? 
    js = "$('#alert').html('#{flash.now[:alert]}').change();" 
    end 
end 

def reload_if_slug_changed object, expected_value 
    "window.location.href = '#{url_for [:edit, object]}';" if object.slug != expected_value 
end 

快閃消息的內容是由Rails responders自動生成,並與now範圍從閃光燈散列刪除所顯示的,確保如果使用者重新載入(後閃光燈已顯示),它們不會再出現。

我不認爲你應該製作一個指向寧靜的create行動的表單,因爲你總是期待重要的重定向,所以在我的情況下,我只需要重定向,如果url slug已經改變。

我希望這會有所幫助。這不是一個解決方案,而只是我處理一些相同問題的方式。

此致敬禮。

3

根據您的情況,這裏的我會怎樣的JavaScript注入到頁面從控制器動作。你已經完成了你的行動插入像這樣的邏輯部分後:

render :update do |page| 
    page << "javascript_here" 
end 

這應該允許你插入你window.location的或者創建一個JavaScript閃光法,並調用它,當你創建方法正確執行。

如果你正在尋找乾涸控制器的動作,我會建議尋找到this Railscast about make_resourceful。 Make_resourceful自動執行每個操作的每個核心活動。它還允許您使用他們創建的掛鉤,例如before :createafter :create,response_for :createafter :create_fails。通過使用這個gem,你可以根據你的方法的成功或失敗來運行代碼,並對它們進行更細粒度的控制。

除了這個,你應該能夠初始化視圖文件create.js.erb和create_fails.js.erb,包括format.js沒有任何東西傳遞給它在你的控制器,和Rails會自動地根據控制器操作是否成功執行,運行包含javascript的文件。