不应用has_one嵌套属性的Permit参数

时间:2017-02-27 16:33:30

标签: ruby-on-rails activerecord nested-attributes

模特课:

class User < ActiveRecord::Base
  has_one :data, inverse_of: :user
  accepts_nested_attributes_for :data
end

发表正文

  

{data:{active:false},data_attributes:{active:false},昵称:&#34; nick&#34;}

Rails Log

  

参数:{&#34;数据&#34; =&gt; {&#34;有效&#34; =&gt; false},&#34; data_attributes&#34; =&gt; {&#34;有效&# 34; =&gt; false},&#34;昵称&#34; =&gt;&#34;昵称&#34;,&#34; id&#34; =&gt;&#34; 1&#34;,&# 34;用户&#34; = GT; {&#34;昵称&#34; = GT;&#34;缺口&#34;}}

PARAMS:

<ActionController::Parameters {"data"=>{"active"=>false}, "data_attributes"=>{"active"=>false}, "nickname"=>"nick", "controller"=>"api/users", "action"=>"update", "id"=>"1", "user"=>{"nickname"=>"nick"}} permitted: false>

params.require(:user).permit(:nickname,data_attributes:[:active])

<ActionController::Parameters {"nickname"=>"nick"} permitted: true>

User.new(a)中

#<User id: nil, provider: "email", uid: "", name: nil, nickname: "nick", image: nil, email: nil, created_at: nil, updated_at: nil>

User.new(a)中。数据

nil

出了什么问题。是对的beahaviour? 需要正确修复嵌套数据对象的是什么?

2 个答案:

答案 0 :(得分:3)

数据哈希应该是这样的:

{user:{active:false},data_attributes:{active:false},昵称:&#34; nick&#34;}

问题是你的哈希是:

Parameters: {"data"=>{"active"=>false}, "data_attributes"=>{"active"=>false}, "nickname"=>"nick", "id"=>"1", "user"=>{"nickname"=>"nick"}}

应该是:

Parameters: {"user"=>{"nickname"=>"nick", "id"=>"1","data_attributes"=>{"active"=>false}}

答案 1 :(得分:1)

我不认为嵌套模型的参数默认是包装的。您可能需要自己将它们包装在“user”键下,或者告诉控制器它应该明确包装哪些参数。

第一个选项应该由您的表单(或JS库,如果您正在执行AJAX请求)处理。

第二种选择是

class UsersController < ApplicationController
  wrap_parameters :user, include: [:data_attributes]
  def create
    # now you can access params[:user][:data_attributes]
  end
end

有关详细信息,请参阅ActionController::ParamsWrapper和此Rails issue上的文档。