2011-06-09 46 views
0

這是我的第一個問題,我目前正在嘗試構建我的第一個Ruby on Rails應用程序,所以這個問題可能是基本的。如何根據Rails 3中的條件轉發/路由請求?

問題:

我希望根網站,其中只包含兩個領域,爲用戶模型電子郵件地址和密碼的一個形式。根據輸入的電子郵件地址是否已經存在,表單應將請求轉發給'users#create'(即創建一個新用戶)或'sessions#create'(即將用戶簽入..如果密碼是正確的)

我試了一下:

爲了解決這個我創建了被稱爲「決定」的頁面控制器新的動作,並指出表單到該頁面。

它基本上是這樣的:

def decide 
    if User.find_by_email(params[:email]) 
    # Copied in all of the code from sessions#create 
    # with a redirect at the end so a /decide page doesn't get rendered 
    else 
    # Copied in all of the code from users#create 
    # with a redirect at the end so a /decide page doesn't get rendered 
    end 
end 

-

現在這個工作,我很爲自己感到驕傲,我理解了它作爲一個完整的初學者,但我能聽到有經驗的程序員在這段代碼中痛苦地哭泣。我很確定這不是「Rails方式」。

我重複了大量的代碼,我覺得我正在把東西放在控制器中,而不是爲此目的而設計的。

另一個問題是我無法讓我的rspec集成測試正常工作,基本上它轉到root_path,用新用戶填寫表單,點擊按鈕,並期待成功刷新...但測試在按下按鈕時返回一個空的html文檔。儘管當我在瀏覽器中做同樣的事情時,它工作得很好。

所以我想:

你不能不知何故把上面,如果在routes.rb中文件中的語句,並請求重定向到相應的控制器和行動?

如果是這樣怎麼樣?

還是有沒有人有不同的想法如何做到這一點?

謝謝

-Konstantin

+0

就你的RSpec問題而言,可能值得多提一些問題,比如:你的規格,更多的代碼等等。 – 2011-06-09 07:56:50

回答

1

其實,這是處理問題的一個相當可靠的方法。

Rails中的路由只能作爲將URL映射到代碼的簡單方法。這樣的邏輯恰好屬於你放置它的地方:在控制器中。

+0

+1 @KonstantinK順便說一句,除非你需要特定的東西,否則不需要編寫自己的認證資料,查看https://github.com/plataformatec/devise – Ant 2011-06-09 08:14:01

+0

好吧,謝謝你的回答。所以頁面控制器確實是正確的地方......但是有沒有辦法不需要粘貼其他創建代碼?我嘗試通過redirect_to params.merge進行轉發! :controller =>:sessions,:action =>:但問題是因爲密碼被過濾,所以他們不會以params的形式傳遞。我想我需要轉發整個請求,而不是重定向它 – KonstantinK 2011-06-09 11:29:13

1

回答我的問題:

原來的規範問題只是由於webrat不按照軌道3重定向它實際上是解決->here例如常見的問題。

所以至少這個問題已經解決了。