在我的ruby on rails项目中,我使用名为plugin_settings
的Postgres https://www.youtube.com/watch?v=YWRYbLKsS0I字段来动态存储我所有插件设置的哈希值。这样,如果编写了一个新插件,则不需要编写任何迁移,以便在我的ActiveRecord对象上保存插件设置。哈希目前是PluginKey:{Plugin Settings}。
这是我的迁移:
class AddHStorePluginSettingsToProject < ActiveRecord::Migration[5.1]
def change
enable_extension 'hstore'
add_column :projects, :plugin_settings, :hstore
add_index :projects, :plugin_settings, using: :gist
end
end
然后每个插件定义它自己的设置,这是Build插件的一个例子。
def settings
settings_list = [
{
key: 'url',
value: '',
display_name: 'Url',
placeholder: "Add a url ..."
}
]
Hash[:build_plugin_settings, settings_list]
end
所以这里我有一个名为url
的设置以及一些帮助我显示表单的属性。
我正在尝试创建一个动态ERB表单,它将遍历我的插件并为每个设置创建字段,然后将其保存回我的hstore字段plugin_settings(或者我可以在表单提交后保存的哈希)这是我现在拥有的:
<% plugins.keys.each do |plugin_key| %>
<fieldset>
<legend><%= plugin_key %></legend>
<div class="form-group">
<div class="form-group">
<% plugins[plugin_key].project_settings.each do |plugin_settings| %>
<% setting_list = plugin_settings.second %>
<% setting_list.each do |setting| %>
<label><%= setting[:display_name] %></label>
<%= text_field_tag "plugin_settings[#{plugin_key}][]", setting_list[:value], class: 'form-control', placeholder: setting[:placeholder], style: 'width:500px' %>
<% end %>
<% end %>
</div>
</div>
</fieldset>
<% end %>
我遇到的问题是我的哈希值完全被值替换,而不是保留其他字段,例如key
和placeholder
。我希望仅更新value
字段来存储整个哈希值(您可以在settings
方法中看到它当前为空)。
我可以创建一个通过params
发送的新哈希,如下所示:hstore。但它不会发送我的整个哈希值,而是取代它。我只是更新value
字段,然后在表单提交后将整个哈希发送回我的控制器。
非常感谢任何帮助。