Ruby on rails 使用简单表单从哈希动态创建输入
我有一个Ruby on rails 使用简单表单从哈希动态创建输入,ruby-on-rails,postgresql,simple-form,Ruby On Rails,Postgresql,Simple Form,我有一个配置模型,它将设置存储在JSONB列中 # Stores site wide configuration settings # This is used in conjunction with PaperTrail to make each change traceable class Configuration < ActiveRecord::Base has_paper_trail validates_uniqueness_of :name after_initia
配置
模型,它将设置
存储在JSONB列中
# Stores site wide configuration settings
# This is used in conjunction with PaperTrail to make each change traceable
class Configuration < ActiveRecord::Base
has_paper_trail
validates_uniqueness_of :name
after_initialize :default_values if :new_record?
private
def default_values
self.settings = {
site_title: 'Portfolio Site'
}
end
end
它给出了
未定义的方法“site\u title”
,因为它不是模型属性。在指定键和值绑定时,我可以使用simple\u formsinput
方法吗?看起来您不能将simple\u form
用于非属性输入。但这将起作用:
= simple_form_for(@configuration) do |f|
= f.input :name
- @configuration.settings.each do |k,v|
= text_field_tag "configurations[settings][#{k}]", v
= f.submit
您可能会扩展默认设置的值,以便还包括您希望通过
数组呈现的输入类型。实际上,这与为哈希创建代理对象或装饰器一样简单,其作用类似于模型
class SettingsDecorator
INPUT_TYPES = {
some_number: :integer
}
# @see http://api.rubyonrails.org/classes/ActiveModel/Naming.html
MODEL_NAME = ActiveModel::Name.new(self.class, nil, 'settings')
# @see http://api.rubyonrails.org/classes/ActiveModel/Naming.html
def model_name
MODEL_NAME
end
def initialize(hash)
@object = hash.symbolize_keys
end
def method_missing(method, *args, &block)
if @object.key? method
@object[method]
elsif @object.respond_to? method
@object.send(method, *args, &block)
end
end
def has_attribute? attr
@object.key? attr
end
def input_type? key
INPUT_TYPES[key]
end
end
Simple Form尝试为每个输入查找列,但如果对象没有响应列的属性,它将优雅地返回到:text
我可以这样使用它:
= simple_form_for(@configuration) do |f|
= f.input :name
- settings = SettingsDecorator.new(@configuration.settings)
= simple_fields_for settings do |sf|
- settings.keys.each do |key|
= sf.input key, as: settings.input_type?(key)
= f.submit
谢谢你的回答,但我已经知道我可以使用内置于表单帮助器中的Rails。我想使用简单表单的原因主要是我不想复制我的基本输入标记。我目前正在研究创建一个像模型一样嘎嘎作响的decorator对象。一个更完整的writeup。
= simple_form_for(@configuration) do |f|
= f.input :name
- settings = SettingsDecorator.new(@configuration.settings)
= simple_fields_for settings do |sf|
- settings.keys.each do |key|
= sf.input key, as: settings.input_type?(key)
= f.submit