我正在开发一款使用Devise 3.2的应用。我在保存member
时尝试获取一些额外的参数。根据文档,我应该能够做到这一点。
在我的application_controller.rb中我有这个(Rails 3.2.22.5)
before_filter :configure_permitted_parameters, if: :devise_controller?
然后我正在尝试文档说应该工作的两个版本。
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << [:name, :site_id]
devise_parameter_sanitizer.for(:accept_invitation) << [:name, :site_id]
end
但这不能说devise base sanitizer expects a Block
。根据我应该能够通过的文件,我试试这个...
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:name, :site_id, :email, :password, :password_confirmation) }
devise_parameter_sanitizer.for(:accept_invitation) { |u| u.permit(:name, :site_id, :invitation_token, :password, :password_confirmation) }
end
......它给了我错误
undefined method permit for # <ActiveSupport::HashWithIndifferentAccess:0x007fbf17e00b40>
我认为这是因为所有内容都在:member =&gt; {...} param,但我不确定,如果是的话,我无法弄清楚语法。我只需要能够使用name
和site_id
属性保存成员。
params看起来像这样
{"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"d9pudkerHaJoP7H7N1vYzWs/SSX1WtRO+8lRD313xP0=", "member"=>{"invitation_token"=>"WLh98kdrFAnyVb879EDS", "name"=>"NAMEHERE", "password"=>"XXXXXXX", "password_confirmation"=>"XXXXXXX", "site_id"=>"XXXXXXXXXXXXX"}, "commit"=>"Set my password", "action"=>"update", "controller"=>"devise/invitations"}
任何人都可以帮我解决这个问题吗?谢谢!
答案 0 :(得分:1)
permit
方法显然可以在其文档中描述的设计中使用,但是它显然有问题https://github.com/plataformatec/devise/blob/v3.5.4/lib/devise/parameter_sanitizer.rb#L65,因为您的代码肯定不起作用,就像我的一样。
您还可以在此处查看非阻止导致该错误的原因:https://github.com/plataformatec/devise/blob/v3.5.4/lib/devise/parameter_sanitizer.rb#L12-L18调用此https://github.com/plataformatec/devise/blob/v3.5.4/lib/devise/parameter_sanitizer.rb#L30-L32
解决此问题的最佳方法是使用gem strong_parameters
,它是ActiveSupport :: HashWithIndifferentAccess的子类。请参阅:https://github.com/rails/strong_parameters#migration-path-to-rails-4
只需将其添加到您的gemfile并捆绑安装:
gem 'strong_parameters'
bundle install