需要帮助解决未定义的方法`permit&#39; for#<activesupport :: hashwithindifferentaccess:0x007fbf17e00b40>

时间:2018-05-25 21:02:43

标签: ruby-on-rails devise devise-invitable

我正在开发一款使用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,但我不确定,如果是的话,我无法弄清楚语法。我只需要能够使用namesite_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"}

任何人都可以帮我解决这个问题吗?谢谢!

1 个答案:

答案 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