需要帮助解决 undefined method `permit' for #<ActiveSupport::HashWithIndifferentAccess:0x007fbf17e00b40>

Need help solving undefined method `permit' for #<ActiveSupport::HashWithIndifferentAccess:0x007fbf17e00b40>

我正在开发一个使用 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 => {...} 参数中,但我不确定这一点,如果是的话我无法弄清楚语法。我只需要能够保存具有 namesite_id 属性的成员。

参数看起来像这样

{"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"}

谁能帮我解决这个问题?谢谢!

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 which calls this 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

所以只需将它添加到您的 gem 文件并捆绑安装:

gem 'strong_parameters'
bundle install