嵌套omniauth的强参数

时间:2016-06-10 13:52:02

标签: ruby-on-rails devise omniauth strong-parameters

我使用Devise 3.5.10创建了一个Rails 4.0.13应用程序。我的User模型:omniauthable使用嵌套 authentications has_many关系,因此用户可以通过多个提供商使用Omniauth:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable,
         :omniauthable, :omniauth_providers => Authentication.auth_methods

  has_many :authentications, dependent: :destroy
  accepts_nested_attributes_for :authentications
end

(我最初在Rails 3.2上实现了这一点,所以我不记得我为完成这项工作所做的确切修改。我不相信它的相关性,但是如果有必要,可以尝试查看。

这意味着使用Omniauth的用户注册具有以下参数:

Parameters: {"utf8"=>"✓", "user"=>{
  "authentications_attributes"=>
  {"0"=>{"provider"=>"open_id",
         "uid"=>"http://pretend.openid.example.com?id=12345",
         "nickname"=>"http://pretend.openid.example.com"}},
  "name"=>"Person1",
  "email"=>"Person1@example.com", "password"=>"[FILTERED]",
  "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}

我无法弄清楚如何获得强大的参数来允许这一点。我当前的尝试是params.require(:user).permit(:name, :email, :password, :password_confirmation, authentications_attributes: {"0" => [:provider, :uid, :nickname]}),但仍会生成Unpermitted parameters: provider, uid, nickname的日志。

我如何允许这些参数?

1 个答案:

答案 0 :(得分:1)

指定嵌套参数时,XYZ_attributes部分采用数组,而不是哈希。

在您的情况下,请尝试

authentications_attributes: [:provider, :uid, :nickname]

params.require(:user).permit(:name, :email, :password, :password_confirmation, authentications_attributes: [:provider, :uid, :nickname])

来源:https://github.com/rails/strong_parameters#nested-parameters