当我有正确数量的字符时,为什么我的 Rails 应用程序返回“密码太短(最少 6 个字符)”?

Isa*_*ina 1 ruby-on-rails fetch bcrypt-ruby reactjs

我正在构建一个简单的注册页面。

这是我的用户模型及其验证和关联:

class User < ApplicationRecord
    has_secure_password

    has_many :posts
    has_many :comments
    has_many :likes

    validates :username, presence: true, uniqueness: true
    validates :password, presence: true, length: { minimum: 6 }
end
Run Code Online (Sandbox Code Playgroud)

这是我的用户迁移:

class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :username
      t.string :password_digest
      t.integer :age
      t.integer :years_in_the_labor
      t.string :title
      t.string :location
      t.string :ministry

      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这也是我的用户控制器创建方法:

def create
    @user = User.new(name: params[:name], title: params[:title], username: params[:username], password: [:password])

    if @user.valid?
        @user.save
        render json: { status: 200, user: @user }
    else
        render json: { status: 401, message: @user.errors.full_messages }
    end
end
Run Code Online (Sandbox Code Playgroud)

我正在通过 发送参数fetch,以下是参数:

<ActionController::Parameters {"name"=>"Test Name User", "title"=>"Test Title User", "username"=>"test_username_user", "password"=>"password123", "controller"=>"users", "action"=>"create", "user"=>{"name"=>"Test Name User", "username"=>"test_username_user", "title"=>"Test Title User"}} permitted: false>
Run Code Online (Sandbox Code Playgroud)

我得到这个错误:

message: ["Password is too short (minimum is 6 characters)"]
Run Code Online (Sandbox Code Playgroud)

尽管我传递了正确数量的字符,但我的密码验证不起作用。

Abd*_* P. 5

你传递给 User.new 只是 [:password] 而不是 params[:password]

它最常用于仅传递参数的私有函数,如下所示:

private

def user_params
   params.require(:user).permit(:name, :title, :username, :password)
end
Run Code Online (Sandbox Code Playgroud)

然后在您的 create 方法中:

@user = User.new(user_params)
Run Code Online (Sandbox Code Playgroud)

更新

而不是询问用户是否有效,您可以直接检查用户是否已保存

if @user.save
  # your code for success
else
  # your code for failure
end
Run Code Online (Sandbox Code Playgroud)