2013-03-11 94 views
1

我通過軌道教程會和我的登錄頁面鍛鍊8.1.5後拋出一個異常,當我點擊沒有電子郵件或PW輸入的登錄按鈕: http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec-rendering_with_a_flash_messageRails的教程3.2第8章錯誤:NoMethodError在SessionsController#創建

錯誤:

NoMethodError in SessionsController#create 
undefined method `[]' for nil:NilClass 
app/controllers/sessions_controller.rb:7:in `create' 

SessionsController最終的代碼完全的創建方法匹配

class SessionsController < ApplicationController 

    def new 
    end 

    def create 
    user = User.find_by_email(params[:session][:email].downcase) #line 7 
    if user && User.authenticate(params[:session][:password]) 
     #will fill this in later 
    else 
     flash.now[:error] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

    def destroy 
    end 
end 

我確實將按鈕標籤更改爲登錄,而不是「登錄」,因爲這與「註冊」過於混淆,但我認爲這不會造成問題。會議\ new.html.erb

<% provide(:title, "Log in") %> 
<h1>Log in</h1> 
<div class="row"> 
    <div class="span6 offset3"> 
    <%= form_for(:sesssion, url: sessions_path) do |f| %> 
     <%= f.label :email %> 
     <%= f.text_field :email %> 

     <%= f.label :password %> 
     <%= f.password_field :password %> 

     <%= f.submit "Log in", class: "btn btn-large btn-primary" %> 

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

這個帖子的提示,我需要在我的用戶模型的方法,但補充說,沒有幫助: NoMethodError in SessionsController#create

我嘗試添加這user.rb,但它並沒有幫助 results from find_by_email executed in function differs from console

def self.authenticate(email, submitted_password) 
    user = find_by_email(email) 
    return user.nil? ? nil : user 
end 

任何想法,將不勝感激!

+0

嗨,你有User.authenticate(params [:session] [:password])方法嗎?在你的User.rb文件中。 – 2013-03-11 05:55:09

+0

不 - 我嘗試添加這一點,但它並沒有幫助:DEF self.authenticate(電子郵件,submitted_pa​​ssword) \t用戶= find_by_email(電子郵件) \t \t回報user.nil? ?無:用戶 \t結束 – 2013-03-11 05:59:04

回答

0

我打量起這本書,你的代碼的例子,我發現這條線

if user && User.authenticate(params[:session][:password]) 

您User.authenticate應小寫來user.authenticate。恢復到您的原始代碼。

+0

感謝 - 沒有運氣添加到user.rb :(我試圖改變你的上述使用電子郵件,而不是名字太多,仍然沒有運氣。我的請求顯示會議參數與電子郵件和PW包括,但如果我有params [:session] [:email],我總是會得到這個錯誤。例如 - 這會在同一行創建一個錯誤:@ email = params [:session] [:email] – 2013-03-11 06:11:21

+0

讓我拿一個看看這個例子,並回復你 – 2013-03-11 06:16:13

+0

我已經更正了答案,你應該刪除我在第一個響應中提到的方法,希望它現在可以工作了! – 2013-03-11 06:19:52

0

我剛剛有同樣的問題,發現事實上我需要[:會議]與結束!

所以行讀取

if user && User.authenticate(params[:sessions][:password]) 

希望這可以幫助別人的未來!

+0

我正在尋找解決方案以及...當我添加s,我得到一個「無效散列」錯誤。 – Linus 2013-04-16 11:05:23

+0

當我使用「會話」和登錄信息是正確的,它的工作原理!但是當登錄信息錯誤時,我得到無效的哈希錯誤。 – Linus 2013-04-16 11:23:33

0

在第8章練習1後,我遇到了同樣的問題,我用form_for替換了form_tag。這導致了在名稱所產生的輸入表單字段改變從name="session[email]"name="session[password]"name="email"name="password"屬性。隨後,我需要訪問使用​​和params[:password]代替params[:session][:email]params[:session][:password]的PARAMS。

我的新會話控制器看起來是這樣的:

class SessionsController < ApplicationController 

    def new 
    end 

    def create 
    user = User.find_by_email(params[:email].downcase) 
    if user && user.authenticate(params[:password]) 
     sign_in user 
     redirect_to user 
    else 
     flash.now[:error] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

    def destroy 
    sign_out 
    redirect_to root_url 
    end 
end 

這解決了這個問題對我來說。希望這對別人有幫助。

0

在教程第8章的本節中,[:session]的所有實例都應該是[:sessions]。希望有所幫助。

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

您能確認app/view/session/new.html.erb拼寫正確嗎?

我看你寫的:

form_for(:sesssion, url: sessions_path) do |f|

但是在應用/控制器/ sessions_controller.rb,你寫道:

user = User.find_by_email(params[:session][:email].downcase) #line 7

他們必須是相同的。

相關問題