gpt4 book ai didi

ruby-on-rails - 如何为 json 嵌套哈希自定义 simple_form

转载 作者:行者123 更新时间:2023-12-04 05:52:22 24 4
gpt4 key购买 nike

我有一些嵌套数据:

@preset = Preset.new
#fields is a postgres json data type
@preset.fields = {'primary_category' => {'category_id' => 57882}}

我想在 POST params[:preset][:fields] 中保留相同的嵌套结构从表单提交,所以我的表单中有这个部分:
<%= text_field_tag("preset[fields][primary_category][category_id]",nil) -%>

简单的表单不知道如何处理 postgres 新类型,如 hstore 或 json 类型。在我的情况下,我真的不需要它来验证或检测数据类型。有没有一种方法可以扩展 SimpleForm 以跳过对列类型的检测,并只输出与文本字段输出相同的现有引导样板,但对于我的任意 json 嵌套键?

也许是这样的用法:
<%= f.input 'preset[fields][primary_category][category_id]', :as => :json_text_field %>

输出与上面的 helper 相同的东西,但周围有标签,以及控制组分类的 div 等。

我已经研究过根据文档扩展输入基类。
class JsonTextFieldInput < SimpleForm::Inputs::Base
def input
"#{@builder.text_field(???, input_html_options)}".html_safe
end
end

但这里是我迷路的地方,因为我不确定要传递给 @builder用我自己的逻辑绕过对属性名称的检查以映射它的哈希键。此外,这只更改表单输入而不是标签,这也需要一些修改。在任何一种情况下,我都无法走得很远,我可以使用一些指导。

最佳答案

我将它用于 jsonb/json 输入:

class JsonbInput < SimpleForm::Inputs::StringInput
def input()
out = ActiveSupport::SafeBuffer.new
Hash[object.send(attribute_name).sort].each do | k, v|
out << template.content_tag(:div, class: 'group') do
template.concat @builder.label(k, object.send(attribute_name), label_html_options)
template.concat @builder.text_field(k, input_html_options)
end
end
out
end

def input_html_options
{class: 'string form-control'}
end

end

您还需要在模型中使用 store_accessor。

关于ruby-on-rails - 如何为 json 嵌套哈希自定义 simple_form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18163545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com