代码之家  ›  专栏  ›  技术社区  ›  Josh

rails api返回密码不能为空,密码为has_secure_

  •  0
  • Josh  · 技术社区  · 6 年前

    我使用 rails new recruiter --api -S -C -T -d postgresql 得到一个简单的api。然后我取消了注意 gem 'bcrypt', '~> 3.1.7' 然后跑 bundle install . 然后我用 rails g scaffold User email:string:uniq password_digest:string is_admin:boolean is_agent:boolean 并添加了 has_secure_password 对模特来说。当我运行post请求时 /users 我得到 "password": "can't be blank" 回来。


    # user.rb
    
    class User < ApplicationRecord
      has_secure_password
    end
    

    # users_controller.rb
    
    class UsersController < ApplicationController
      before_action :set_user, only: [:show, :update, :destroy]
    
      # GET /users
      def index
        @users = User.all
    
        render json: @users
      end
    
      # GET /users/1
      def show
        render json: @user
      end
    
      # POST /users
      def create
        @user = User.new(user_params)
    
        if @user.save
          render json: @user, status: :created, location: @user
        else
          render json: @user.errors, status: :unprocessable_entity
        end
      end
    
      # PATCH/PUT /users/1
      def update
        if @user.update(user_params)
          render json: @user
        else
          render json: @user.errors, status: :unprocessable_entity
        end
      end
    
      # DELETE /users/1
      def destroy
        @user.destroy
      end
    
      private
        # Use callbacks to share common setup or constraints between actions.
        def set_user
          @user = User.find(params[:id])
        end
    
        # Only allow a trusted parameter "white list" through.
        def user_params
          params.require(:user).permit(:email, :password_digest, :is_admin, :is_agent)
        end
    end
    

    这是我的邮递员的json post请求: JSON POST request from Postman

    我做错什么了?我希望这将创建一个新用户,该用户的加密密码保存在 password_digest . 我尝试重新运行迁移并重新启动服务器。我试着为 password_confirmation 到json post请求。同样的结果。我甚至按照所有相同的步骤构建了一个测试应用程序,除了 bcrypt 有安全密码 post返回新用户,所以,问题在于我如何使用 BCRIPT . 我可以在Rails控制台中看到密码没有被用户传递,但我不知道为什么。

    Parameters: {"email"=>"user@example.com", "password"=>"[FILTERED]", "is_admin"=>true, "is_agent"=>true, "user"=>{"email"=>"user@example.com", "is_admin"=>true, "is_agent"=>true}}
       (0.2ms)  BEGIN
      ↳ app/controllers/users_controller.rb:20
       (0.2ms)  ROLLBACK
      ↳ app/controllers/users_controller.rb:20
    Completed 422 Unprocessable Entity in 17ms (Views: 0.2ms | ActiveRecord: 6.2ms)
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Josh    6 年前

    您不允许输入密码 user_params . 可能有点像下面可以工作

    def user_params
          params.require(:user).permit(:email, :password, :is_admin, :is_agent)
    end
    

    更多关于密码摘要的信息 https://medium.com/@tpstar/password-digest-column-in-user-migration-table-871ff9120a5

    此外,json请求需要包装在 user 对象:

    {
      "user":
      {
        "email": "user@example.com",
        "password": "password",
        "is_admin": true,
        "is_agent": true
      }
    }
    
        2
  •  0
  •   Yaroslav V.    6 年前

    问题在于:

    params.require(:user).permit(:email, :password_digest, :is_admin, :is_agent)
    

    你派 :password ,但允许 :password_digest