我的模型上有一个JSONB字段,用户可以通过我的API进行CRUD。一切正常。
我希望能够使内部人员/管理员用户能够通过textarea表单字段来编辑JSON设置对象。 (用户精通技术,并且会知道如何编写有效的JSON。)
在Rails UI中,当我打开记录时,该窗体将JSON设置加载到textarea中,但保存后,整个对象将被有效擦除。
我可以看到设置参数已发送:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"bla_bla_bla", "users_notification"=>{"user_id"=>"48", "report_id"=>"2", "status"=>"1", "frequency"=>"1", "settings"=>"{\"threshold\"=>\"50\"}"}, "commit"=>"Update Users notification", "id"=>"18"}
我有99%的把握确定已将这些参数正确列入白名单:
def users_notification_params
params.require(:users_notification).permit(
:user_id,
:report_id,
:status,
:frequency,
:settings,
settings: [:threshold, :products, :avg_sales]
)
end
但是,当我输出带puts的users_notification_params时,我看到设置为nil:
{"user_id"=>"48", "report_id"=>"2", "status"=>"1", "frequency"=>"1", "settings"=>nil}
我认为我需要解析设置参数,因此可以设置一个before_action回调,但是当我输出users_notification_params时,我仍然看到"settings"=>nil
,所以我没有什么可以解析的。
有什么想法吗?
答案 0 :(得分:0)
我认为问题是Rails不会自动将JSON字符串解析为哈希,而您正在尝试将哈希列入白名单。尝试删除settings: [:threshold, :products, :avg_sales]
。然后,您必须在模型或控制器中解析JSON。
class Thing < ApplicationRecord
def settings=(val)
if val.is_a?(String)
begin
super JSON.parse(val)
rescue JSON::ParserError
errors[:settings].add('is not valid JSON')
super
end
end
end
end
通常,似乎可以通过在每个设置中使用单独的输入来完成某些事情,但是这似乎很笨拙。您可以为此使用store_accessor
。
答案 1 :(得分:0)
除了为管理员提供更改文本字段的权限外,您还可以为表单提供其他设置字段:
<%= form_with(model: users_notification, local: true) do |form| %>
<%= form.fields_for(:settings) do |sf| %>
<div class="field">
<%= sf.label :threshold %>
<%= sf.number_field :threshold %>
</div>
<% end %>
...
<% end %>
这样,参数将类似于
{"users_notification"=>{"settings"=>{"threshold"=>"1"}}
这将与您的permit
一起使用。