Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用简单表单从哈希动态创建输入_Ruby On Rails_Postgresql_Simple Form - Fatal编程技术网

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 forms
input
方法吗?

看起来您不能将
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