在文本区域表单字段中编辑JSONB数据

时间:2018-11-01 11:25:51

标签: ruby-on-rails ruby postgresql jsonb

我的模型上有一个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,所以我没有什么可以解析的。

有什么想法吗?

2 个答案:

答案 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一起使用。