2015-12-30 108 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

大声笑好吧让我知道如果你想在将来使用它 –