我是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
这对我很有帮助,拜托。
答案 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设置默认controllers
,routes
和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
在您的观看中,您可以使用current_user
,user_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
添加到您的用户模型。
答案 3 :(得分:1)
如果您使用devise gem,则不应使用has_secure_password
方法。您应该使用valid_password?
方法。