2012-07-12 41 views
0

我在Ruby on Rails的小白,我有一個愚蠢的問題:在我的session_controller 我有simple_form_for重定向提交

def create 
    user = User.find_by_email(params[:email]) 
    if user && user.authenticate(params[:password]) 
     session[:user_id] = user.id 
     redirect_to root_path, :notice => "Logged in!" 
    else 
     flash.now.alert = "Invalid email or password" 
     render "new" 
    end 
    end 
在路線

我 匹配「/登入」,到:「會議#NEW」

在new.html.haml我

= simple_form_for :session do |f| 
    = f.input :email 
    = f.input :password 
    = f.button :submit, 'Sign in!' 

當我按下‘登錄’按鈕,我希望這種方法‘製造’將被調用(它是如何工作的我用戶模型),但調試顯示我「新」的方法,我有「authenticity_token」沒有填寫電子郵件和密碼。 有人可以解釋我發生了什麼嗎? 我不明白何時方法「新」調用,然後其他方法。

回答

4

此行爲與simple_form無關。您沒有指定要調用的動作的url,您不會傳遞任何模型來推斷其路徑,因此最終將使用調用空hash的url_for()方法。這個調用的結果是當前頁面,顯然這與您的表單顯示的路徑相同,但以POST作爲HTML-verb。

要呼叫您的sessions_path,而不是你new_session_path你可以做到以下幾點:

= simple_form_for :session, url: :sessions do |f| 

正在通過url_for處理,這是有效地等同於指定url: sessions_path但正在魔術師出你。

1

我不使用haml我使用erb,但我懷疑工作是一樣的。在erb中,表單需要調用一個動作,例如:

form_for :session, :url => {:action => "create"} do |f| 

這將調用會話控制器的create方法。所以我想HAML將

simple_form_for :session, :url => {:action => "create"} do |f| 

希望這有助於