2012-08-01 138 views
0

我對添加[:session]給params感到困惑。它似乎也打破了我的網站。有人可以解釋這對我有什麼作用嗎?Ruby on Rails教程第9章

class SessionsController < ApplicationController 
    . 
    . 
    . 
    def create 
    user = User.find_by_email(params[:session][:email]) 
    if user && user.authenticate(params[:session][:password]) 
     sign_in user 
     redirect_back_or user 
    else 
     flash.now[:error] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 
    . 
    . 
    . 
end 

錯誤消息:

1)認證登入與無效信息 故障/錯誤:前{click_button 「登錄」} NoMethodError: 未定義的方法[]' for nil:NilClass # ./app/controllers/sessions_controller.rb:7:in創建」 #(EVAL):2 :在'

EDIT click_button' # ./spec/requests/authentication_pages_spec.rb:18:in塊(4級)8/2

我相信問題涉及一種SW從form_for癢到form_tag。我失去了交換機會話的參考,因爲我無法弄清楚如何正確包含它。如果任何人有任何關於這個問題的建議,將不勝感激。我想知道是否有一個實際的理由讓它成爲params [:session] [:email]而不是它只是爲了組織?

new.html.erb

<% provide(:title, "Sign in") %> 
<h1>Sign in</h1> 

<div class="row"> 
    <div class="span6 offset3"> 
    <%= form_tag sessions_path do %> 

     <%= label_tag :email %> 
     <%= text_field_tag :email %> 

     <%= label_tag :password %> 
     <%= password_field_tag :password %> 

     <%= submit_tag "Sign in", class: "btn btn-large btn-primary" %> 
    <% end %> 

    <p>New user? <%= link_to "Sign up now!", signup_path %></p> 
    </div> 
</div> 
+0

您可以發送您的應用程序/會議/ create.html.erb嗎?您還可以在創建操作的頂部添加'puts params'並將結果呈現給我們。 – Dougui 2012-08-01 18:34:47

+0

我假設你指的是我現在包含的new.html.erb。 – Roger 2012-08-02 16:46:18

回答

1

嘗試刪除[:會議]括號,這對我的工作

+0

這確實有效,並且導致我找出問題所在。 – Roger 2012-08-02 15:49:54

0

它剎車代碼「COS的PARAMS [:會議]是零,我認爲和你試圖從零獲得[:email],什麼原因會導致異常。教程中應該有一些代碼來定義params [:session]散列。試着看起來更好。 要使代碼穩定,您必須確保params [:session]總是被定義的,或者嘗試使用ternar函數params [:session]? PARAMS [:會議] [:郵箱]: ''

0

您可以在您的視圖替換此:

<%= form_for :session, :url => sessions_path do %> 

    <%= label_tag :email %> 
    <%= text_field_tag :email %> 

    <%= label_tag :password %> 
    <%= password_field_tag :password %> 

    <%= submit_tag "Sign in", class: "btn btn-large btn-primary" %> 
<% end %> 

的form_tag產生只是一個HTML表單標籤和的form_for用來描述的東西。用form_for創建的表單字段的所有輸入將具有這樣的名稱:user_session[email]。因此,當您提交表單時,在您的控制器中,您將擁有:params[:user_session][:email]

+0

使用form_tag代替form_for的原因是數據庫沒有被涉及,是正確的嗎?爲什麼我應該切換回form_for?我能從嵌套哈希中獲得什麼優勢? – Roger 2012-08-02 20:13:44

+0

form_tag僅生成一個HTML表單標籤,而表單用於描述某些內容。所有使用'form_for'創建的表單字段的輸入將具有這樣的名稱:'user [login]'。所以,當你提交表單時,在你的控制器中,你會得到這個:'params [:user] [:login]' – Dougui 2012-08-03 11:48:24

+0

我改變了我的答案。 – Dougui 2012-08-03 11:49:51

相關問題