【问题标题】:Rails_Admin - How to edit each key of a Jsonb as a field?Rails_Admin - 如何将 Jsonb 的每个键编辑为一个字段?
【发布时间】:2022-12-22 09:58:26
【问题描述】:

我的模型中有一个 jsonb 属性,称为 config_params。 config_params: {key_a: 1, key_b: 100}

我需要在 rails_admin 中编辑它,但我需要将每个键作为不同的字段进行编辑。 key_a 一个字段和 key_b 另一个,如果存在。

问题是因为每个 config_param 可以保存不同的键,这让我好像需要在构建字段之前知道对象,而我不能只构建虚拟字段。它需要做动态。

我通过单例在模型上创建了动态属性,效果很好!但我无法在字段的构建时间访问该对象以获取构建字段的 config_params 键。

【问题讨论】:

  • 请显示您尝试过的任何代码。对于那些不熟悉 rails-admin 但愿意提供帮助的人,您能否展示 rails-admin 用来执行此操作的代码?
  • 你能分享你的代码吗?

标签: json ruby-on-rails ruby jsonb rails-admin


【解决方案1】:

我用单例方法和一个部分解决了它。

在模型中,我添加回调以在运行时加载属性:

after_initialize :load_configs
after_find :load_configs

加载配置方法

def load_configs
  config_params&.keys&.each do |param|
    define_singleton_method(param) do
      config_params[param]
    end

    define_singleton_method("#{param}=") do |value|
      config_params[param] = value
    end
  end
end

好的!现在你有了一个 jsonb 字段,其中有很多键,每个键在实例方法上都有一个属性。

例子:

instance.config_params = {'key_a': 1, key_b: 2}
instance.save

instance.reload.key_a
1
instance.key_a = 10
instance.key_a
10
instance.key_b
2

好的!型号还行!

现在你需要将它加载到管理中,好吗? 我们走吧!

到一个文件中,你将 rails_admin 配置到你的模型中

edit do
  group 'Configurations' do
    field :config_params do
      partial 'config_params_partial'
    end
  end
end

现在您需要将部分文件创建到 de 文件夹中

app/views/rails_admin/main/_config_params_partial.html.erb

部分代码是这样的

<% @object.config_params&.each do |key, value| %>
  <%= form.fields_for :config_params, @object.config_params[key] do |config_params_fields| %>
      <div class="field controls">
        <%= config_params_fields.label @object.type.config_params[key]['label'] %>
        <br/>
        <%= config_params_fields.text_field key,
          :value => value,
          type: @object.type.config_params[key]['kind'],
          disabled: @object.type.config_params[key]['editable'] == false,
          class: 'form-control' %>
          <% if  @object.type.config_params[key]['required'] == true %>
            <span class="help-block">Obrigatório. </span>
          <% end %>
      </div>
  <% end %>
<% end %>

观测系统:我创建了一个名为 type 的模型,它控制关于我的字段的每个元信息,但您可以将其创建为锁定的,仅填充字段属性。

重启服务器,开心就好!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多