我正在尝试通过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
我已经定义了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
但我不知道如何将此regerral_params方法与JSON输入字符串一起使用....
答案 0 :(得分:18)
您可以尝试将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
方法内的第一行解析你的JSON(如果我没记错的话,返回一个Ruby哈希)并从中创建一个新的ActionController::Parameters
对象。第二个在类似params的对象上使用permit
和require
。
params
通常是根据帖子数据键/值对自动创建的,其类型为ActionController::Parameters
。要使用permit
和require
,您必须从哈希中手动创建that class对象。
然后使用这些消毒的参数,你必须改变
@inputData = Person.new(JSON.parse(data))
到
@inputData = Person.new(referral_params)