在 Rails 上启用 Bcrypt 5
Enabling Bcrypt on Rails 5
我正在 Rails 5.0.0 上启动一个新应用程序并尝试使用 bcrypt。我已经按照 bcrypt 存储库上的说明进行操作,但是在我得到 ActiveModel::ForbiddenAttributesError
时缺少了一些东西
这里是 user.rb
:
require 'bcrypt'
class User < ActiveRecord::Base
include BCrypt
def password
@password ||= Password.new(password_hash)
end
def password=(new_password)
@password = Password.create(new_password)
self.password_hash = @password
end
has_many :trips
end
迁移详细信息:
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :first_name, null: false
t.string :last_name, null: false
t.string :email, null: false
t.string :password_hash, null: false
t.timestamps
end
end
end
users_controller.rb:
class UsersController < ApplicationController
def create
user = User.new(params[:user])
user.password = params[:password]
user.save!
end
def new
@user = User.new
end
private
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
end
这是堆栈跟踪的开头:
Started POST "/users" for ::1 at 2016-09-19 16:44:20 -0700
Processing by UsersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"GWJXon2Y914Y7m2NGPAj8wz+9O6EBO1OnrIcBBRis/ATMkaGMCRh6uE4PAxJOIE7mVrornt5PqOvxBjoOBo9ag==", "user"=>{"first_name"=>"test", "last_name"=>"test2", "email"=>"123@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create User"}
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms)
ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):
app/controllers/users_controller.rb:4:in `create'
Rendering /Users/.rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout
在我看来你收到错误的原因是因为这一行
user = User.new(params[:user])
您正在尝试传递参数 :user
。在您的 user_params
方法中,
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
:user
不是允许的参数之一。
你需要做的就是改变
user = User.new(params[:user])
到
user = User.new(user_params)
您需要调用 user_params
函数并将其作为参数传递给 User.new
。
我正在 Rails 5.0.0 上启动一个新应用程序并尝试使用 bcrypt。我已经按照 bcrypt 存储库上的说明进行操作,但是在我得到 ActiveModel::ForbiddenAttributesError
这里是 user.rb
:
require 'bcrypt'
class User < ActiveRecord::Base
include BCrypt
def password
@password ||= Password.new(password_hash)
end
def password=(new_password)
@password = Password.create(new_password)
self.password_hash = @password
end
has_many :trips
end
迁移详细信息:
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :first_name, null: false
t.string :last_name, null: false
t.string :email, null: false
t.string :password_hash, null: false
t.timestamps
end
end
end
users_controller.rb:
class UsersController < ApplicationController
def create
user = User.new(params[:user])
user.password = params[:password]
user.save!
end
def new
@user = User.new
end
private
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
end
这是堆栈跟踪的开头:
Started POST "/users" for ::1 at 2016-09-19 16:44:20 -0700
Processing by UsersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"GWJXon2Y914Y7m2NGPAj8wz+9O6EBO1OnrIcBBRis/ATMkaGMCRh6uE4PAxJOIE7mVrornt5PqOvxBjoOBo9ag==", "user"=>{"first_name"=>"test", "last_name"=>"test2", "email"=>"123@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create User"}
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms)
ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):
app/controllers/users_controller.rb:4:in `create'
Rendering /Users/.rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout
在我看来你收到错误的原因是因为这一行
user = User.new(params[:user])
您正在尝试传递参数 :user
。在您的 user_params
方法中,
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
:user
不是允许的参数之一。
你需要做的就是改变
user = User.new(params[:user])
到
user = User.new(user_params)
您需要调用 user_params
函数并将其作为参数传递给 User.new
。