Ruby on rails Rails 5在Desive中向“User”添加一些属性
我使用的是Rails 5.1,我添加了用于用户身份验证的Desive。我在表中添加了一些额外的属性。在我通过ajax创建了一个新用户之后,用户创建了一个新用户,但是缺少了一些属性。我检查了日志,designe没有在insert查询中发送这些列 首先,我将designe_参数_消毒剂添加到我的应用程序控制器:Ruby on rails Rails 5在Desive中向“User”添加一些属性,ruby-on-rails,ruby,devise,Ruby On Rails,Ruby,Devise,我使用的是Rails 5.1,我添加了用于用户身份验证的Desive。我在表中添加了一些额外的属性。在我通过ajax创建了一个新用户之后,用户创建了一个新用户,但是缺少了一些属性。我检查了日志,designe没有在insert查询中发送这些列 首先,我将designe_参数_消毒剂添加到我的应用程序控制器: before_action :configure_permitted_parameters, if: :devise_controller? protected def configur
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:email,:password1,:password2,:title,:phone, :first_name , :last_name, :postalcode, :address,:coordinate, :latitude, :longitude])
end
@user = User.new
@user.email = params[:sign_up][:email]
@user.password = params[:sign_up][:password1]
@user.password_confirmation =params[:sign_up][:password2]
@user.phone = params[:sign_up][:phone]
@firstname = params[:sign_up][:first_name]
@user.first_name = @firstname
@user.last_name = params[:sign_up][:last_name]
@user.postalcode = params[:sign_up][:postalcode]
@coordinate = Geocoder.coordinates(params[:sign_up][:postalcode])
@user.coordinate = @coordinate
@user.latitude = @coordinate[0]
@user.longitude = @coordinate[1]
@user.address = params[:sign_up][:address]
@user.valid?
if @user.errors.blank?
@user.save
end
我在我的用户模型中添加了attr_访问器:
属性访问器:password1、:password2、:phone、:postalcode、:first\u name、,
:姓氏,:地址
在注册控制器中结束以下代码“我的创建方法”:
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:email,:password1,:password2,:title,:phone, :first_name , :last_name, :postalcode, :address,:coordinate, :latitude, :longitude])
end
@user = User.new
@user.email = params[:sign_up][:email]
@user.password = params[:sign_up][:password1]
@user.password_confirmation =params[:sign_up][:password2]
@user.phone = params[:sign_up][:phone]
@firstname = params[:sign_up][:first_name]
@user.first_name = @firstname
@user.last_name = params[:sign_up][:last_name]
@user.postalcode = params[:sign_up][:postalcode]
@coordinate = Geocoder.coordinates(params[:sign_up][:postalcode])
@user.coordinate = @coordinate
@user.latitude = @coordinate[0]
@user.longitude = @coordinate[1]
@user.address = params[:sign_up][:address]
@user.valid?
if @user.errors.blank?
@user.save
end
我在控制台中看到以下日志:
SQL(0.5ms)插入“用户”(“电子邮件”,“加密密码”,
“创建时间”、“更新时间”、“用户角色”、“纬度”、“经度”,
“坐标”)值($1、$2、$3、$4、$5、$6、$7、$8)返回“id”
[“电子邮件”jd@gmail.com“],[“加密密码”,
“$2a$11$Rsn8pM0wVfiRAHwMQ/8YTeYGDn6qzAvZEFPJjqq4Ri.xZfGdof9f6”],
[“创建于”,“2017-11-13 12:07:27.781262”],[“更新于”,
“2017-11-13 12:07:27.781262”]、[“用户角色”、“t”]、[“纬度”,
53.3960084],“经度”,-2.929237],“坐标”,“[53.3960084,-2.929237]]
为什么我的代码将坐标、经度和格度属性保存到db中,而不保存名字、姓氏和地址属性?我怎样才能解决这个问题?
最好的
编辑:
我的js代码:
$.ajax({
type: "POST",
url: "/users",
data: {
sign_up: {
first_name: $('#firstname').val(),
last_name: $('#lastname').val(),
email: $('#email').val(),
password1: $('#password1').val(),
password2: $('#password2').val(),
postalcode: $('#postalcode').val(),
phone: $('#phone').val(),
website: $('#website').val(),
title: $('#title').val(),
address: $('#address').val(),
}
},
我的用户Shcema
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.inet "current_sign_in_ip"
t.inet "last_sign_in_ip"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "superadmin_role"
t.boolean "user_role"
t.string "first_name"
t.string "last_name"
t.string "phone"
t.string "post_code"
t.float "latitude"
t.float "longitude"
t.string "coordinate"
t.string "address"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
结束
编辑2:
我通过以下方式进行了测试:
@u = User.create(first_name: params[:sign_up][:first_name], email:
params[:sign_up][:email], password: params[:sign_up][:password1])
@u.save!
结果是
参数:{“注册”=>{“名字”=>,“姓氏”=>“联系人”,
“电子邮件”=>”Test1603@test.com“,“password1”=>“[已筛选]”,
“密码2”=>“[过滤]”、“postalcode”=>“L16 2WA”、“电话”=>“123456”,
“地址”=>“地址”}}(0.5ms)开始用户存在(0.5ms)选择
1作为“用户”中的一个,其中“用户”。“电子邮件”=$1限制$2[[“电子邮件”,
"test1603@test.com“],[“限制”,1]]SQL(1.0ms)插入“用户”
(“电子邮件”、“加密密码”、“创建时间”、“更新时间”)值
($1,$2,$3,$4)返回“id”[[“email”,”test1603@test.com"],
[“加密密码”,
“$2a$11$K2fQmO4GcnwH3egXLDzJr.KGERWoMR93tF9Vp7OMNxqVE7KPVKfwm”],
[“创建于”,“2017-11-13 13:03:56.876695”],[“更新于”,
“2017-11-13:03:56.876695”](0.5ms)提交(0.0ms)开始(0.5ms)提交在218ms内完成200 OK(视图:0.3ms| 活动记录:3.0ms)
从模型中删除属性访问器您不需要一次设置一个属性。您可以在中看到完整的代码示例。尽管如此,我不明白您的代码失败的原因。向控制器发送哪些参数?也许你把
first\u name
和firstname
或者类似的东西混在一起了?您的数据库模式是什么?如果没有用于用户的列。first_name
(即,它只是一个虚拟属性),则它无法持久保存到数据库。我添加了我的js代码。我检查了controller:first\u name和:last\u name中的值是否不为空。那么数据库架构呢?是否users.first\u name
实际上是一个持久化属性?我从shema.rb中添加了users部分。我需要attr\u访问器,但我删除了attr\u访问器中的db列。谢谢你的帮助。现在我的attr_访问器是:attr_访问器:password1,:password2,:postalco。为什么不保存邮政编码和密码?为什么你有两个密码?我不会在数据库中存储邮政编码。我正在使用查找坐标。Password1和Password2用于后端的第二次检查密码。我将存储在db only password列上。你是说这就像密码确认一样吗?