【问题标题】:Password can't be blank in Rails (Using has_secure_password)Rails 中的密码不能为空(使用 has_secure_password)
【发布时间】:2015-06-03 23:37:24
【问题描述】:

我对 Rails 完全陌生,我知道在 StackOverflow 上已经存在很多关于这个问题的问题,但我尝试了几乎所有的解决方案,但没有一个解决方案对我有用。

我正在尝试使用 has_secure_password 在我的 rails 项目中实现身份验证,并且我遵循了 rails 文档中提到的所有步骤。 提交创建用户表单后,即使我在输入框中输入密码并确认密码值,我也会收到“密码不能为空”错误消息。

如果我遗漏了什么,请提出建议。

我遵循的步骤是- 1) 在 gem 文件中添加以下行 - 宝石'bcrypt',要求:'bcrypt' 2)捆绑安装 3) 我的型号代码-

class User < ActiveRecord::Base
  validates :name, presence: true, uniqueness: true
  has_secure_password
end

4) 我的视图代码 -

<div>
          <%= f.label :name %>:
          <%= f.text_field :name, size: 40 %>
        </div>
        <div>
          <%= f.label :password, 'Password' %>:
          <%= f.password_field :password, size: 40 %>
        </div>
        <div>
          <%= f.label :password_confirmation, 'Confirm' %>:
          <%= f.password_field :password_confirmation, size: 40 %>
        </div>
        <div>

5) 我的控制器代码 -

def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        format.html { redirect_to users_url,notice: "User #{@user.name} was successfully created." }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

【问题讨论】:

  • 你用的是什么bcrypt版本?
  • 3.1.7 甚至我都试过没有指定任何版本
  • 您的user_params 是否将passwordpassword_confirmation? 列入白名单
  • 不..我该怎么做?
  • 您的user_params 方法应该将passwordpassword_confirmation 都传递给permit 方法调用。如果您将该方法添加到您的问题中,那就太好了。

标签: ruby-on-rails ruby authentication


【解决方案1】:

非常感谢大家帮助我。我能够解决这个问题。

我在控制器中添加了下面的代码行

 wrap_parameters :user, include: [:name, :password, :password_confirmation]

文档- http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html

这解决了我的问题。

【讨论】:

    【解决方案2】:

    您应该将与密码相关的字段添加到user_params

    def user_params
      params.require( :user ).permit( :password, :password_confirmation, :etc1, :etc2 )
    end
    

    【讨论】:

    • 我尝试了上述解决方案,但它不起作用:(仍然得到同样的错误。我的方法 - def user_params params.require(:user).permit(:name, :password_digest,:password, :password_confirmation ) 结束
    【解决方案3】:

    尝试按照此处的步骤操作: See Listing 7.17

    抱歉,尚未检查您的控制器和您的评论 :) 这应该可以解决问题

    【讨论】:

    • 我也做了同样的事情..:)
    • password_digest 应该在数据库表中,对吗?在我的情况下也是如此。
    • 尝试将您的 private user_params 方法放在您的控制器上,并为您的用户放置您需要的所有参数:)
    猜你喜欢
    • 2017-12-07
    • 2015-02-02
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2014-09-06
    • 2013-11-05
    相关资源
    最近更新 更多