2011-05-24 169 views
7

我有一些truble重定向我的用戶到上一頁。重定向回不工作

以下是電影控制器中更新方法的示例。

def update 
    @movie = Movie.find(params[:id]) 
    if @movie.update_attributes(params[:movie]) 
    flash[:notice] = "The given movie is now updated." 
    end 
    respond_with(@movie, location: :back) 
end 

我收到此錯誤。

undefined method 'hash_for_back_url' for #<Module:0x00000103eeaaa8>respond_with行。

我正在使用Rails 3.1 rc1和Ruby 1.9。

它可以在做這樣的事情時起作用。

respond_with(@movie, location: request.referer)

任何人都知道爲什麼:back參數將無法正常工作?

+0

不應該是:location =>:back? – jaydel 2011-05-25 00:34:35

+0

@jaydel - 您可以在Ruby 1.9中使用新的語法。 – 2011-05-25 02:57:02

+0

這可能是值得嘗試舊的語法,以確保它不是這樣的... – 2011-05-25 18:01:38

回答

8

對我而言唯一的解決方案是使用request.referer

解決方案#1

respond_with(@comment, location: request.referer) 

解決方案#2

class ApplicationController < ActionController::Base 
    helper_method :redirect_back 

    def redirect_back(options = {}) 
    if request.referer 
     redirect_to request.referer, options 
    else 
     redirect_to root_path, options 
    end 
    end 
end 

# View/controller 

redirect_back notice: "Sending you back ... hopefully" 
+0

或簡化該幫助程序以返回路徑並與respond_with一起使用:def redirect_back_path request.referer || root_path結束 – nruth 2014-08-15 15:11:24

0

在這種情況下respond_with期待:位置是一個URL輔助方法,像在respond_with(@movie, :location => movie_url(@movie))

你也許應該使用這種方法中的一種,而不是結果:

  • 重定向到一個信息頁面redirect_to @movie,相當於redirect_to movie_path(@movie)

  • 再次使用更新後的數據再次呈現表格render :action => :edit(:edit表示操作使用d來顯示錶格)

+0

這個解決方案依賴於'MoviesController#show'方法,在我的情況下它不存在。問題是我不知道用戶如何獲得'MoviesController#edit'頁面,但我仍然想將用戶重定向回原始頁面。例如,我可以在我的網站上的10個不同的地方編輯鏈接。 – Oleander 2011-06-02 11:59:17

+0

在編輯方法上保存引用者,並通過會話或隱藏字段將其傳遞給更新方法。如果需要@movie對象,則在redirect_to或respond_with中使用它。 – 2011-06-02 19:57:47

+0

我仍然認爲這應該自動工作。只需使用'location::back'就足夠了。 – Oleander 2011-06-15 08:45:22

0

如何:

respond_with @movie do |format| 
    format.html { redirect_to :back } 
end 

讓你覆蓋默認的HTML響應,這樣就可以使用redirect_to :back