2010-05-07 93 views
5

如果我在一個路由別名,如/ register,我有一個表單錯誤,我渲染:新,有可能是/註冊路徑仍然可以?重定向到表單上的路由別名驗證錯誤

在它呈現的那一刻/新

我可以做一個redirect_to的register_path但隨後我就失去了PARAMS?

它讓下面的測試失敗:

Scenario: Try registering with a bad staff number 
Given I am on the registration page 
When I fill in "email" with "[email protected]" 
And I fill in "First Name" with "Kevin" 
And I fill in "last name" with "Monk" 
And I fill in "Employee Number" with "something barking123" 
And I press "Register" 
Then I should be on the registration page 
And I should see "Your employee ID number looks incorrect." 
+1

我問過類似的問題並得到答案,請參閱http:// stackoverflow。com/questions/1083798/use-custom-route-model-validation-failure – 2010-05-07 14:18:46

+0

爲了愛上喬布斯,請糾正最後一句中的語法。您不希望您的網站出現在Error'd上。 「您的員工ID號碼看起來不正確。」 – mcandre 2010-05-25 16:50:31

+0

哦,是啊!好點子。你的權利! – 2010-05-26 18:04:34

回答

1

另一種方法是設置兩個「註冊」路線。一個只接受GET請求(並轉到:new動作),另一個只接受POST請求(並轉到create動作,但呈現與新的相同的模板)。

這可能是這樣的:

map.get_register 'register', :controller => :registrations, 
       :action => :new, :conditions => { :method => :get } 
map.post_register 'register', :controller => :registrations, 
       :action => :create, :conditions => { :method => :post } 

然後在你的控制器:

def new 
    @registration = Registration.new 
    # renders the 'registrations/new' template 
end 
def create 
    @registration = Registration.new(params[:registration]) 

    # render the 'registrations/new' template if we fail validation 
    return render(:action => :new) unless @registration.save 
    # otherwise renders the "create" template which is likely a thank-you 
end 

似乎有更多類似的靜脈在這個問題上: Use custom route upon model validation failure

+0

嗨Taryn, 這正是我到底做了什麼。 感謝您的回答。 Kevin。 – 2010-08-26 10:42:46

1

Rails的辦法就是再次渲染「新」(即註冊)行動開展以來,已創建的對象,形式將包含以前輸入的值以及錯誤消息。如果重定向,則必須在重定向之前將對象保存在會話或數據庫中。當與常規背道而馳時,確保您有足夠的理由這樣做總是很好的。

1

從動作調用呈現將意味着URL將保持不變,無論是GET或POST。網址爲/新的原因是因爲'註冊'必須在POST之後/新。如果你想要這個功能通過,你應該改變「那麼我應該在註冊頁面」爲「那麼我應該在新的註冊頁面」並寫出相應的網頁步驟,在我看來。

0

如果你真的想要這個,那麼你可以將你的'創建'動作合併到'新'動作中,並將'更新'動作合併到'編輯'動作中。然後你需要檢查請求類型並相應地處理它。

這將實現你所要求的。此外,人們可以使用「錯誤」URL並仍然轉到有效頁面。也就是說,即使遇到錯誤,他們也可以複製/粘貼網址,並且會有一個有效的GET頁面。

這就是說,這是一個主要的黑客攻擊,而不是我推薦你做的事情。你必須做很多工作,而且好處很小。

編輯:例如..

def new 
    if request.get? 
    @user = User.new 

    elsif request.post? 
    @user = User.new(params[:user]) 
    if @user.save 
     redirect_to users_path 
    else 
     render :new 
    end 
    end 
end 

還就需要添加自定義路線。

0

真的,這看起來像是測試中的一條線。 (爲什麼你更喜歡登錄/註冊頁面?)。

如果它真的很重要,你也可以暫時在會話變量中存儲參數。