强参数和json输入轨道4

JNI*_*oad 6 json ruby-on-rails nested-attributes strong-parameters ruby-on-rails-4

我试图通过JSON String保存数据,其中我有嵌套的关联属性.我不想使用attr_accessible.我几乎得到了强参数的逻辑,但仍然有问题使它们工作.我正在获取JSON字符串并使用它来使用它来保存数据

data = request.body.read
@inputData = Person.new(JSON.parse(data))
@inputData.save!
if@inputData.valid?
  render :status => 200, :json => "Data inserted successfully"
else
  render :status => 404, :json => "Not Inserted "
end
Run Code Online (Sandbox Code Playgroud)

我已经定义了permit strong参数方法允许这样的嵌套属性

def referral_params
params.require(:person).permit(:id, user_attributes: [:id, :first_name, :last_name, :email], device_attributes: [:id, :os_type, :os_version], location_attributes: [:id, :latitude, :longitude], duration_attributes[:id, :start_time, :end_time]) end
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使用此regerral_params方法以及JSON输入字符串....

yer*_*ips 19

您可以尝试将referral_params方法更改为:

def referral_params
  json_params = ActionController::Parameters.new( JSON.parse(request.body.read) )
  return json_params.require(:person).permit(:id, user_attributes: [:id, :first_name, :last_name, :email], device_attributes: [:id, :os_type, :os_version], location_attributes: [:id, :latitude, :longitude], duration_attributes[:id, :start_time, :end_time])
end
Run Code Online (Sandbox Code Playgroud)

方法内的第一行解析你的JSON(如果我没记错的话,返回一个Ruby哈希)并ActionController::Parameters从中创建一个新对象.第二个使用permitrequire那个类似params的对象.

params通常是根据后期数据键/值对自动创建的,并且属于该类型ActionController::Parameters.要使用permitrequire,您必须从哈希手动创建该类的对象.


然后使用这些消毒的参数,你必须改变

@inputData = Person.new(JSON.parse(data))
Run Code Online (Sandbox Code Playgroud)

@inputData = Person.new(referral_params)
Run Code Online (Sandbox Code Playgroud)