2015-12-30 109 views
4

我是Ruby on Rails應用程序的新手,我已經創建了CRUD,但仍然堆積在Login & Logout功能。在軌道上紅寶石未定義的方法'驗證'?

這是我Sessions_controller:

def new 
end 

def create 
    user = User.find_by(email: params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:passkey]) 
    # Log the user in and redirect to the user's show page. 
    else 
    # Create an error message. 
    flash[:danger] = 'Invalid email/password combination' # Not quite right! 
    render 'new' 
    end 
end 

def destroy 
end 

這是我的看法:new.html.erb

<%= form_for(:session, url: login_path) do |f| %> 

    <%= f.label :email %> 
    <%= f.email_field :email, class: 'form-control' %> 

    <%= f.label :passkey%> 
    <%= f.password_field :passkey, class: 'form-control' %> 

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

這是我的模型:

class User< ActiveRecord::Base 
    validates :first_name, :presence => true, :length => { :in => 3..20 } 
    validates :last_name, :presence => true, :length => { :in => 3..20 } 
    validates :email, :presence => true, :uniqueness => true, format: { with: /\A[^@\s][email protected]([^@.\s]+\.)+[^@.\s]+\z/ } 
    validates :passkey, :confirmation => true, :length => {:in => 6..20} 
end 

當我點擊登錄按鈕後,顯示此錯誤:

NoMethodError in SessionsController#create undefined method `authenticate' for #User:0x0000000d5c65e0>

我該如何解決這個錯誤?

我使用ruby 1.9.7Rails 4.2.5 & mysql2

這將幫助我很多,請。

+0

請分享你的'用戶'模型。它沒有'authenticate'方法,如錯誤信息中所述。 – mudasobwa

+0

嗨@mudasobwa我已更新我的帖子 –

+2

請同時使用有意義的標題來解答問題, G。「未定義的方法'認證'」,而不是通用的「如何解決錯誤。」 – mudasobwa

回答

1

只需添加

has_secure_password 

你的用戶模型。確保你添加

gem 'bcrypt-ruby' 

到你的gem文件。

添加一個名爲「password_digest」字段與您的用戶模型中的字符串。

就是這樣。 Rails將爲你處理用戶身份驗證,就像魅力一樣,你也可以在模型上使用#authenticate方法!

編輯: 你可以在github上看看這個項目 - Rails Project @ Github 我一直在使用這個Rails的實施認證。簽出user.rb,gemfile和user_controller.rb。

1

那麼看起來你的User類缺少authenticate方法。你應該實現這一點。

如果您想使用內置的Rails身份驗證,您應該將has_secure_password validations: false添加到您的用戶模型中。

編號:http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/InstanceMethodsOnActivation.html#method-i-authenticate

+0

嗨@Bert Goethals我認爲你是對的,但現在顯示'未定義的局部變量或方法'password_digest'' –

+3

我正在寫一個答案你 –

+0

請慢慢寫出答案我正在等待這 –

2

I'm newbie on ruby on rails application

這個答案將是斷章取義的,但如果你是新的,我最肯定推薦使用Devise在滾動自己的身份驗證。您可以看到一個very good tutorial on how to use Devise here

-

總之,設計處理所有的後端進行身份驗證;它建立在warden之上,併爲您提供預軋製的控制器sessions & registrations

我推薦Devise給你,因爲你是新的。

創建自己的身份驗證雖然相對簡單,但需要大量的經驗才能理解。從你的問題來看,你似乎在跟隨一個教程或其他什麼,並且不太瞭解控制認證用戶過程的基本原則。

我可能是錯的,但如果你實施設計,讓它工作,那麼你就可以做出自己的事後......


如果你想使用Devise,你會做以下幾點:

#Gemfile 
gem 'devise', '~> 3.5', '>= 3.5.3' 

$ rails generate devise:install 
$ rails generate devise User 
$ rake db:migrate 

這將設置爲制訂默認controllersrouteswarden strategies;它會自己添加到您的Model如果允許您運行您的服務器並使驗證工作。

你想使用devise helpers來管理你的應用程序的不同部分的訪問:

#app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base 
    before_action :authenticate_user! #-> user has to "login" to access app 
end 

在你的意見,你可以使用current_useruser_signed_in?和一堆其他幫助的,以提供用戶中心功能:

#app/views/layouts/application.html.erb 
<%= render partial "nav" if user_signed_in? %> 

這只是我的建議,它不會幫助您自己實現您的身份驗證。當然,如果不恰當,我會刪除答案。


要解決你現在所擁有的問題,

undefined method `authenticate'

這意味着你不必在你的User模型的authenticate實例方法。您需要:

#app/models/user.rb 
class User < ActiveRecord::Base 
    def authenticate 
     # do something 
    end 
end 

有人懷疑你試圖調用Warden's authenticate! method

我沒有典獄長巨大的經驗;你會想確保你正在爲它調用正確的方法。因爲它的機架中間件,所有的warden助手都可以通過env["warden"],所以我懷疑你會使用類似:

#app/models/user.rb 
class User < ActiveRecord::Base 
    def authenticate 
    env["warden"].authenticate! .... 
    end 
end 
+0

嗨**豐啄**感謝您的好答案,但我累了應用此,我試圖以另一種方式 –

+0

大聲笑好吧讓我知道如果你想在將來使用它 –