使用 Devise 创建用户时更新数据库字段 gem

Updating a database field when Creating a User using Devise gem

说明

我想在用户注册帐户时设置用户的安全级别。我不希望这是注册表单中的隐藏字段,因为一个人可以发送自己的值来尝试获得管理权限。所以,它需要在 RegistrationController 中。

版本

Ruby:2.2.1p85(2015-02-26 修订版 49769)[x86_64-darwin14]

Rails: 4.2.0

文件

这是我目前的情况。

app/config/routes.rb 文件添加了以下行:

devise_for :users, :skip => [:sessions, :registrations], 
           :controllers => { registrations: 'users/registrations' }

devise_scope :user do
    get    "login",             to: "devise/sessions#new",          as: :new_user_session
    post   "login",             to: "devise/sessions#create",       as: :user_session
    delete "logout",            to: "devise/sessions#destroy",      as: :destroy_user_session

    get    "register",           to: "devise/registrations#new",     as: :new_user_registration
    post   "register",           to: "devise/registrations#create",  as: :user_registration
    get    "account/delete",     to: "devise/registrations#cancel",  as: :cancel_user_registration

    get    "user/profile/edit",  to: "devise/registrations#edit",    as: :edit_user_registration

    patch  "user",              to: "devise/registrations#update"
    put    "user",              to: "devise/registrations#update"
    put    "register",          to: "devise/registrations#update"
    delete "user/delete",       to: "devise/registrations#destrony"

    get    "user/profile",      to: 'devise/registrations#edit',    as: :user_root
end

这是我在 app/controllers/users/registration_controller.rb 文件中的 RegistrationController:

class Devise::RegistrationsController < DeviseController

    before_filter :configure_permitted_parameters, :only => [:create]

    def create
        super
          resource.update_attribute(:security_level, '1')
    end
end

我的数据库确实有一个名为 'security_level' 的字段供所有用户使用。

提前感谢您提供的任何帮助。

您将来可能会遇到逻辑重复问题(例如,从控制台创建用户不会强制 Rails 填充安全级别属性,因此您需要在每个地方控制它)。最好在 User 模型中使用回调:

class User < ActiveRecord::Base

  before_save :set_security_level

  def set_security_level
    self.security_level = 1
  end
end

因此,每次要保存 User 时,都会执行 :set_security_level

回调手册http://guides.rubyonrails.org/active_record_callbacks.html

如果你想设置 security_level = 1,默认情况下我建议你将它写入 rails 迁移。

迁移代码

change_column_default :users, :security_level, '1'

如果您想通过覆盖默认的 devise crete 函数来做更多事情,请使用下面的代码。

class RegistrationsController < Devise::RegistrationsController
  def create
    super do
        resource.security_level = '1'
        resource.save
    end
  end
end