未定义的方法'authenticate'在轨道上的红宝石?

时间:2015-12-30 09:23:51

标签: ruby-on-rails ruby ruby-on-rails-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]+@([^@.\s]+\.)+[^@.\s]+\z/ }
  validates :passkey, :confirmation => true, :length => {:in => 6..20}
end

当我点击“登录”按钮,然后显示此错误:

SessionsController中的NoMethodError #create 未定义的方法`authenticate&#39; #User:0x0000000d5c65e0>

如何修复此错误?

我正在使用ruby 1.9.7 Rails 4.2.5&amp; mysql2

这对我很有帮助,拜托。

4 个答案:

答案 0 :(得分:2)

  

我是关于rails应用程序的ruby的新手

这个答案将脱离背景,但如果你是新手,我绝对建议使用Devise而不是滚动你自己的身份验证。

您可以看到very good tutorial on how to use Devise here

-

简而言之,设计处理所有后端进行身份验证;它建立在warden之上,为您提供预先sessions&amp; registrations控制器。

我推荐Devise给你,因为你是新人。

创建自己的身份验证虽然相对简单,但需要很多经验才能理解。从您的问题看,您正在遵循教程或其他任何内容,并且不太了解管理用户身份验证过程的基本原则。

我可能错了,但如果你实施Devise,让它运转起来,那么你就可以自己制作了......

如果您想使用Devise,请执行以下操作:

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

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

这将为Devise设置默认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? %>

这只是我的建议,它不会帮助您自己实施身份验证。当然,如果不合适,我会删除答案。

要解决您现在遇到的问题,

  

未定义的方法`authenticate'

这意味着您的authenticate模型上没有User实例方法。您需要以下内容:

#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

答案 1 :(得分:2)

添加

has_secure_password

到您的用户模型。确保添加

gem 'bcrypt-ruby'

到你的gemfile。

在用户模型中添加一个名为“password_digest”的字段,其中包含字符串。

就是这样。 Rails会像魅力一样为你处理用户身份验证,你也可以在你的模型上使用#authenticate方法!

编辑: 你可以在github看看这个项目 - Rails Project @ Github 我已经使用Rails实现了身份验证。 Checkout user.rb,gemfile和user_controller.rb。

答案 2 :(得分:1)

好吧,您的User课程似乎缺少authenticate方法。你应该实现它。

如果您想使用内置的Rails身份验证,则应将has_secure_password validations: false添加到您的用户模型。

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

答案 3 :(得分:1)

如果您使用devise gem,则不应使用has_secure_password方法。您应该使用valid_password?方法。