Rails 4 设备 3.2 使用自定义属性注册,未知属性错误



Issue 看起来很简单,让我上墙,到目前为止已经花费了我数周的生产时间,而且我认为这个问题不会很快消失,因为它绝对会在嵌套属性进入的任何地方弹出。

Started POST "/users" for 127.0.0.1 at 2013-11-12 04:56:03 +0100
Processing by Devise::RegistrationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"afucNMlRRQkgBeKVVwOQxvjtMtvCDPiQLilr7TXXnUg=", "user"=>{"email"=>"test7@test.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "first_name"=>"test7", "last_name"=>"test7", "preferred_language"=>"en", **"master_data_contact_information"=>**{"contact_email"=>"test7@test.com", "primary_phone_number"=>"23452352345234", "secondary_phone_number"=>"324523453245", "fax_number"=>"23452345234"}, "group_token"=>""}, "commit"=>"Register"}
Completed 500 Internal Server Error in 96ms
ActiveRecord::UnknownAttributeError (unknown attribute: master_data_contact_information):

怎么可能不知道呢? 它就在那里。

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:email) }
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password,
  :password_confirmation, :first_name,
  :last_name, :preferred_language,
  :group_token,
  :master_data_contact_information =>
    [:contact_email, :primary_phone_number, :secondary_phone_number, :fax_number ]
 ) }
end

如果我将其更改为:

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:email) }
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password,
  :password_confirmation, :first_name,
  :last_name, :preferred_language,
  :group_token
  ) }
end

我得到

Unpermitted parameters: master_data_contact_information

那么嵌套资源和强参数是怎么回事呢?


在 RubyMine 控制台中运行时,它工作正常。

params = ActionController::Parameters.new user: {"email"=>"test5@test.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]",
                                                 "first_name"=>"testqr", "last_name"=>"nsdfjkhasdfjk", "preferred_language"=>"en", "group_token"=>"",
                                                 "master_data_contact_information"=>
                                                     {"contact_email"=>"test10@test.com", "primary_phone_number"=>"786789678678",
                                                      "secondary_phone_number"=>"56675675876567", "fax_number"=>"2456246"}}

p = params.require(:user).permit(:email, :password, :password_confirmation, :first_name,
                                 :last_name, :preferred_language, :group_token,
                                 :master_data_contact_information => [:contact_email, :primary_phone_number, :secondary_phone_number, :fax_number ]
)

一切都闪闪发光。


我知道 Rails 的核心人员希望让 Rails 更安全,但这占用了我很多时间。

它在简单的模型上效果非常好,是的。

当事情开始变得有点复杂时,所有的地狱休息都会失败。

尝试将:master_data_contact_information更改为:master_data_contact_information_attributes

所以你有这样的东西:

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:email) }
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password,
  :password_confirmation, :first_name,
  :last_name, :preferred_language,
  :group_token,
  :master_data_contact_information_attributes =>
    [:contact_email, :primary_phone_number, :secondary_phone_number, :fax_number ]
 ) }
end

相关内容

最新更新