【问题标题】:Rails 5 Adding some attributes to `User` in DeviseRails 5 向 Devise 中的“用户”添加一些属性
【发布时间】:2018-04-26 02:58:52
【问题描述】:

我使用的是 Rails 5.1,我添加了用于用户身份验证的设计。我在我的表中添加了一些额外的属性。在我通过 ajax 创建新用户后,用户已创建,但缺少某些属性。我检查了日志,设计没有在插入查询中发送这些列。

首先我将 devise_parameter_sanitizer 添加到我的应用程序控制器中:

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

我将 attr_accessor 添加到我的用户模型中:

attr_accessor :password1,:password2, :phone, :postalcode, :first_name, :last_name, :address

在注册控制器中结束以下代码我的创建方法:

    @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) INSERT INTO "users" ("email", "encrypted_pa​​ssword", “created_at”、“updated_at”、“user_role”、“纬度”、“经度”、 “坐标”)值(1 美元、2 美元、3 美元、4 美元、5 美元、6 美元、7 美元、8 美元)返回“id” [[“电子邮件”,“jd@gmail.com”],[“加密密码”, "$2a$11$Rsn8pM0wVfiRAHwMQ/8YTeYGDn6qzAvZEFPJjqq4Ri.xZfGdof9f6"], ["created_at", "2017-11-13 12:07:27.781262"], ["updated_at", "2017-11-13 12:07:27.781262"], ["user_role", "t"], ["纬度", 53.3960084], ["经度", -2.929237], ["坐标", "[53.3960084, -2.929237]"]]

为什么我的代码将坐标、经度和纬度属性保存到数据库而不保存名字、姓氏和地址属性?我怎样才能解决这个问题? 最好的

编辑: 我的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(),
                }
            },

我的用户界面

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!

结果是

参数:{"sign_up"=>{"first_name"=>"", "last_name"=>"Onder", "email"=>"Test1603@test.com", "password1"=>"[FILTERED]", "password2"=>"[FILTERED]", "postalcode"=>"L16 2WA", "phone"=>"123456", "address"=>"address"}} (0.5ms) BEGIN 用户存在 (0.5ms) SELECT 1 作为一个来自“用户” WHERE “用户”。“电子邮件”= $1 限制 $2 [[“电子邮件”, "test1603@test.com"], ["LIMIT", 1]] SQL (1.0ms) INSERT INTO "users" (“email”、“encrypted_pa​​ssword”、“created_at”、“updated_at”)值 ($1, $2, $3, $4) 返回 "id" [["email", "test1603@test.com"], [“加密密码”, "$2a$11$K2fQmO4GcnwH3egXLDzJr.KGERWoMR93tF9Vp7OMNxqVE7KPVKfwm"], ["created_at", "2017-11-13 13:03:56.876695"], ["updated_at", "2017-11-13 13:03:56.876695"]] (0.5ms) COMMIT (0.0ms) BEGIN
(0.5ms) COMMIT Completed 200 OK in 218ms (Views: 0.3ms | 活动记录:3.0 毫秒)

【问题讨论】:

  • 您不需要像那样一次设置一个属性。您可以在Devise README 中看到完整的代码示例。
  • 话虽如此,但我看不出您的代码失败的原因。哪些参数被发送到控制器?也许您将first_namefirstname 或类似的混淆了?你的数据库架构是什么?如果users.first_name 没有列(即它只是一个虚拟属性),那么它就不能持久化到数据库中。
  • 我添加了我的 js 代码。我检查了控制器中的值:first_name 和 :last_name 不为空。
  • 那么数据库模式呢? users.first_name 实际上是持久属性吗?
  • 我从我的 shema.rb 添加了用户部分。

标签: ruby-on-rails ruby devise


【解决方案1】:

从您的模型中删除 attr_accessor

【讨论】:

  • 我需要 attr_accessors,但我删除了 attr_accessor 中的 db 列。谢谢你的帮助。现在我的 attr_accessors 是: attr_accessor :password1,:password2,:postalcode
  • 但是为什么不保存邮政编码和密码呢?为什么你有 2 个密码?
  • 我不会在我的数据库中存储邮政编码。我用于查找坐标。
  • Password1 和 Password2 用于后端的第二次检查密码。我将仅存储在 db 密码列中。
  • 你的意思是像密码确认一样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多