Rails 和 Devise 的强大参数
Posted
技术标签:
【中文标题】Rails 和 Devise 的强大参数【英文标题】:Strong parameters with Rails and Devise 【发布时间】:2013-04-29 01:48:53 【问题描述】:我正在使用设计的 rails 4.0 分支以及 ruby 2.0.0p0 和 Rails 4.0.0.beta1。
这是一种我正在检查我是否以正确的方式做事的问题,或者我是否应该做其他事情。我敢肯定,很多迁移到 Rails 4.0 的人都面临着同样的问题(在谷歌搜索类似的事情之后)。
我已阅读以下链接:
Devise and Strong Parameters https://gist.github.com/kazpsp/3350730 https://github.com/plataformatec/devise/tree/rails4#strong-parameters现在我使用设计创建了一个用户模型,我使用上述要点创建了以下控制器(并确保将其包含在我的路由文件中)。我的额外参数是 first_name 和 last_name。
class Users::RegistrationsController < Devise::RegistrationsController
def sign_up_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
def account_update_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :current_password)
end
private :sign_up_params
private :account_update_params
end
还有什么我应该做的吗?这是从现在开始做事的最佳方式吗(自从放弃 attr_accessor 以来)。我的表格似乎工作正常(新的和更新的)。要点说要使用“resource_params”,但这总是在我的服务器日志中给出“Unpermitted parameters”错误。
【问题讨论】:
【参考方案1】:对于 Rails 5,Devise 4 使用这个:
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :email, :password, :password_confirmation])
end
end
Reference
【讨论】:
这正是我所需要的。欣赏它。【参考方案2】:在config/initializers
中添加一个模块非常好用,所有parameters
都像这样
module DevisePermittedParameters
extend ActiveSupport::Concern
included do
before_filter :configure_permitted_parameters
end
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) |u| u.permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
end
DeviseController.send :include, DevisePermittedParameters
【讨论】:
我试过这个方法,但它对我不起作用。控制器端是否需要做一些事情来包含模块还是自动的?【参考方案3】:感谢 Devise 的 Rails4 分支的最新更新,它实际上不需要插入“resource_params”。
我创建了一个全新的 Rails4 应用程序并遵循基本的 Devise 安装步骤,我的应用程序运行正常,所以我认为你做得很好。
但是有一个修改过的要点,如果您需要,它会在允许的参数方面为您提供一些额外的细节:
来源:https://gist.github.com/bluemont/e304e65e7e15d77d3cb9
# controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
before_filter :configure_permitted_parameters
protected
# my custom fields are :name, :heard_how
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) do |u|
u.permit(:name, :heard_how,
:email, :password, :password_confirmation)
end
devise_parameter_sanitizer.for(:account_update) do |u|
u.permit(:name,
:email, :password, :password_confirmation, :current_password)
end
end
end
【讨论】:
非常感谢!救了我。 谢谢,也帮了我。这应该是公认的答案。以上是关于Rails 和 Devise 的强大参数的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4、Devise 和 Mandrill 电子邮件
Rails、Devise、Role Model 和 CanCanCan - 定义能力
使用 Rails 和 Devise 进行功能测试。在我的固定装置里放啥?