2011-02-07 39 views
1

我目前有一個Rails如何執行和響應驗證結果的問題。我有一個用戶註冊表單。用戶可以在兩個不同的地方打這個表格。他們可能會從主頁或從users/new。這兩種形式都會發布到同一個地方,因爲我試圖保持乾爽。Rails驗證條件重定向

users/new頁面按預期工作。如果用戶有驗證問題,它將返回並填充表單。主頁上出現問題的位置。如果用戶有驗證問題,現在重定向到users/new頁面。我更希望在主頁上時,我會將用戶返回到同一頁面並在那裏顯示驗證結果。控制器中有沒有辦法重定向到用戶所在的表單?

def create 
    @user = User.new(params[:user]) 

    respond_to do |format| 
    if @user.save 
     format.html { redirect_to(@user, :notice => 'User was successfully created.') } 
     format.xml { render :xml => @user, :status => :created, :location => @user } 
    else 
     format.html { render :action => "new" } # I'm thinking I can do something here? 
     format.xml { render :xml => @user.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

我試圖改變render :action => 'new'行重定向到URL的用戶,但並未奏效。有什麼我失蹤?

+0

因此,當用戶在主頁上有驗證問題時,它不會重定向,它只會呈現錯誤的視圖...對嗎? – dontangg 2011-02-07 21:53:37

+0

正確。驗證問題將導致用戶始終轉到用戶表單。即使原始表單位於索引頁上。不幸的是,需求指定用戶可以從兩個地方註冊。 – 2011-02-07 22:01:27

回答

2

首先,我想補充查詢字符串參數,它從像這樣的東西來到它發佈到與控制器和行動的網址:

# Using form_tag 
<%= form_tag user_path(@user, :controller_name => controller.controller_name, :action_name => controller.action_name) do %> 

# Using form_for 
<%= form_for @user, :url => user_path(@user, :controller_name => controller.controller_name, :action_name => controller.action_name) do %> 

然後,您可以更新create的行動,行控制器是這樣的:

render '#{params[:controller_name]}/#{params[:action_name]}' 

更新

我才意識到次在使用上面的代碼時,將在第一次驗證失敗時呈現正確的視圖,但如果第二次驗證失敗,它將嘗試呈現users/create視圖。如果這是您想要採用的路線,則不應在視圖中使用controller.controller_name等,但應正確指定@controller_name並改用該變量。但是,這隻會增加Xavier所做的「矯枉過正」的評論。

+0

我一直在想這個,並且遇到了與我的代碼相同的問題。驗證失敗兩次,並且我永遠失去它的位置;你可以調整工作:將`:controller_name => controller.controller_name`替換爲::controller_name => params [:controller_name] || params [:controller]`(同樣用`:action`),所以它只會使用當前的控制器和動作,如果它之前沒有看到它們 - 也就是我們第一次加載表單。我仍然認爲這是很多代碼,但它的工作原理,我當然不能想到一個更簡單的方法... Upvote - 歡呼! – 2011-02-07 23:35:55

0

嘗試redirect_to :back
它是redirect_to(request.env["HTTP_REFERER"])

哎呀的簡寫,它僅適用於成功。對不起

好吧,那麼你必須檢查他來自哪裏(通過查看request.env [「HTTP_REFERER」])的塊(在format.html之後)並呈現相應的操作。

+0

雖然這帶我到正確的頁面,但驗證不會在設置時進行設置。通過重定向,我失去了錯誤信息。 – 2011-02-07 21:47:48

2

藝術在正確的軌道上,但你不能使用重定向,因爲你需要在你的控制器中設置的實例變量@user,這將在新的HTTP請求中丟失(因爲任何請求都由一個新的,乾淨的控制器實例)。

但是你可以自己使用的引用者信息,並用它來選擇合適的頁面渲染:

render :action => (request.referer =~ /\/users\/new/)? :new : :index 

注:另一個答案彈出,而我是張貼的提示將舊的控制器/行動領域到你的表格,但這對我來說似乎有點矯枉過正 - 你已經在request.referer有你需要的所有信息。

希望有幫助!