在轨道上的ruby中未定义的方法'authenticate'?

foo*_*dev 5 ruby ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

这是我的看法: 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 %>
Run Code Online (Sandbox Code Playgroud)

这是我的模特:

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
Run Code Online (Sandbox Code Playgroud)

当我单击"登录"按钮,然后显示此错误:

SessionsController#中的NoMethodError创建未定义的方法`authenticate'for #User:0x0000000d5c65e0>

我该如何解决这个错误?

我正在使用ruby 1.9.7 Rails 4.2.5&mysql2

那对我很有帮助,拜托.

Ric*_*eck 6

我是 ruby​​ on Rails 应用程序的新手

这个答案将断章取义,但如果您是新手,我绝对建议您使用Devise滚动自己的身份验证。

您可以在此处查看有关如何使用 Devise 的非常好的教程

--

简而言之,Devise处理所有用于身份验证的后端;它建立在之上warden并为您提供预滚动sessionsregistrations控制器。

我向您推荐 Devise,因为您是新人。

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

我可能是错的,但如果你实施 Devise,让它工作,那么你之后就可以自己制作......


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

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

$ rails generate devise:install
$ rails generate devise User
$ rake  db:migrate
Run Code Online (Sandbox Code Playgroud)

这将为Devise设置默认值controllersroutes和;warden 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
Run Code Online (Sandbox Code Playgroud)

在您看来,您可以使用current_useruser_signed_in?许多其他帮助程序来提供以用户为中心的功能:

#app/views/layouts/application.html.erb
<%= render partial "nav" if user_signed_in? %>
Run Code Online (Sandbox Code Playgroud)

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


为了解决您现在遇到的问题,

未定义方法“验证”

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

#app/models/user.rb
class User < ActiveRecord::Base
   def authenticate
      # do something
   end
end 
Run Code Online (Sandbox Code Playgroud)

有人怀疑你正在尝试调用Warden 的authenticate!方法

我对典狱长没有丰富的经验;您需要确保为其调用正确的方法。因为它是机架中间件,所以所有warden帮助程序都可以通过 获得env["warden"],所以我怀疑您将使用类似的东西:

#app/models/user.rb
class User < ActiveRecord::Base
   def authenticate
     env["warden"].authenticate! ....
   end
end
Run Code Online (Sandbox Code Playgroud)


Pra*_*dar 5

只需添加

has_secure_password
Run Code Online (Sandbox Code Playgroud)

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

gem 'bcrypt-ruby'
Run Code Online (Sandbox Code Playgroud)

到你的 gem 文件。

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

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

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