【问题标题】:Rails 4 NoMethodError validate (bcrypt)Rails 4 NoMethodError 验证(bcrypt)
【发布时间】:2014-01-02 08:22:34
【问题描述】:

我正在尝试在生产中启动我的 Rails 4 应用程序(它只是一个简单的博客,其中包含一个登录表单,供数据库中的用户登录和 CRUD)

我正在运行带有 unicorn 和 bcrypt 的 nginx,以在 User 模型上使用 has_secure_password 进行用户身份验证。当我尝试登录用户时,我的 production.log 显示:

NoMethodError (undefined method `authenticate' for nil:NilClass):
app/controllers/sessions_controller.rb:9:in `create'

在我的 Sessions 控制器中,这个块是调用验证方法的部分:

user = User.find_by_email(params[:session][:email])
if user && user.authenticate(params[:session][:password])
    sign_in user
    redirect_to root_path
else
    flash.now[:warning] = "Invalid User/Password combination"
    render 'new'
end

除非我将 else 语句更改为其他内容,否则我会收到“无效的用户/密码组合”错误消息并呈现 /sessions

真正奇怪的是,当我在 Rails 控制台中运行 User.find_by_email("user's email").authenticate("user's password") 时,我得到了用户返回给我。

我完全不明白为什么我的用户身份验证在开发模式下有效,但在生产模式下无效!

以下是遇到相同问题的示例应用程序的 github 存储库: https://github.com/sentrathis96/debug_app

【问题讨论】:

    标签: ruby-on-rails nginx unicorn bcrypt


    【解决方案1】:

    尝试以下方法:

    在您的生产服务器上运行此命令

    $ RAILS_ENV=production bundle exec rake db:migrate
    

    另外,确保bcrypt-ruby gem 已添加到您的 Gemfile 中,并且bundle install 在 PRODUCTION SERVER 上成功执行。

    另外,在生产服务器上打开代码并验证您的 User 模型是否包含 has_secure_password 宏

    class User < ActiveRecord::Base
      has_secure_password
    end
    

    还要确保您的数据库架构中有一个 password_digest 字段。

    如果仍然无法正常工作,请在 github 上发布一个重现此错误的示例应用程序,我们可以帮助您调试。

    【讨论】:

    • 确保 has_secure_password 位于生产服务器上的 User.rb 模型上,并且 RAILS_ENV=production rake db:migrate 已运行。仍然得到这个 NoMethodError ......只有当我使用 -E 生产运行独角兽时。我正在开发一个示例应用程序来重现此错误。
    • 对于 Unicorn,确保它的进程在正确的 ENV 中生成。所以用bundle exec unicorn -c config/unicorn.rb -E production启动。您仍然收到错误消息吗?
    • 当我使用 -E production 运行 unicorn 时,我在生产日志中收到错误,当我在没有 -E production 的情况下运行 unicorn 时,我的用户身份验证有效。这对我没有好处,因为 rails 加载了开发 sqlite 开发数据库
    • 我添加了一个示例应用程序的链接,该应用程序使用 bcrypt 的身份验证方法存在相同问题
    • 我发现当服务器处于生产模式时,我的会话控制器无法访问用户模型。因此,当我调用 User.find 时,它没有运行,因此通过 has_secure_password 的身份验证方法不可用。为什么在生产中控制器和模型之间的关系会不同?
    【解决方案2】:

    我遇到的问题是在开发数据库中创建用户,而不是在生产中。所以在生产 VPS 上,我必须运行 RAILS_ENV=production rails c 来创建我的用户,以便有一个用户记录可以登录。

    如果遇到类似情况,请务必在必要的环境中创建必要的记录!

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多