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