Simple_form 表单对象缺少映射
Simple_form with Form Object missing Mapping
我正在使用 simple_form_for
<%= simple_form_for( @form_object, url: wizard_path, :method => :put) do |f| %>
<%= f.input :website %>
<%= f.submit %>
</div>
<% end %>
不过,我也在使用表单对象
class Base
include ActiveModel::Model
# Validations
# Delegations
# Initializer
end
我的问题是我的输入没有映射到我的数据库列,所以 https://github.com/plataformatec/simple_form#available-input-types-and-defaults-for-each-column-type
None 出现了,我可以创建自定义映射吗?
如何让 Simple_form 看到我的列类型并正常工作?
如果我检查我的委托字段的 class,它们似乎显示为 :string 或 :integer 等
simple_form
使用 2 种方法从标准模型(type_for_attribute
和 has_attribute?
)确定输入类型字段映射。 Source
由于您将模型包装在另一层中,但仍需要 simple_form
提供的推论,您只需要通过
将这些调用委托给原始模型
class Wrapper
include ActiveModel::Model
attr_reader :model
delegate :type_for_attribute, :has_attribute?, to: :model
def initialize(model)
@model = model
end
end
但是,如果您没有包装模型,则需要自己定义这些方法,例如(使用新的 rails 5.2 属性 API)
class NonWrapper
include ActiveModel::Model
include ActiveModel::Attributes
attribute :name, :string
def type_for_attribute(name)
self.class.attribute_types[name]
end
def has_attribute?(name)
attributes.key?(name.to_s)
end
end
示例
a = NonWrapper.new(name: 'engineersmnky')
a.has_attribute?(:name)
#=> true
a.type_for_attribute(:name)
#=> => #<ActiveModel::Type::Value:0x00007fffcdeda790 @precision=nil, @scale=nil, @limit=nil>
注意 像这样的表单对象可能需要添加其他内容才能与 simple_form 一起使用。这个答案简单地解释了如何处理输入映射推断
我正在使用 simple_form_for
<%= simple_form_for( @form_object, url: wizard_path, :method => :put) do |f| %>
<%= f.input :website %>
<%= f.submit %>
</div>
<% end %>
不过,我也在使用表单对象
class Base
include ActiveModel::Model
# Validations
# Delegations
# Initializer
end
我的问题是我的输入没有映射到我的数据库列,所以 https://github.com/plataformatec/simple_form#available-input-types-and-defaults-for-each-column-type
None 出现了,我可以创建自定义映射吗?
如何让 Simple_form 看到我的列类型并正常工作?
如果我检查我的委托字段的 class,它们似乎显示为 :string 或 :integer 等
simple_form
使用 2 种方法从标准模型(type_for_attribute
和 has_attribute?
)确定输入类型字段映射。 Source
由于您将模型包装在另一层中,但仍需要 simple_form
提供的推论,您只需要通过
class Wrapper
include ActiveModel::Model
attr_reader :model
delegate :type_for_attribute, :has_attribute?, to: :model
def initialize(model)
@model = model
end
end
但是,如果您没有包装模型,则需要自己定义这些方法,例如(使用新的 rails 5.2 属性 API)
class NonWrapper
include ActiveModel::Model
include ActiveModel::Attributes
attribute :name, :string
def type_for_attribute(name)
self.class.attribute_types[name]
end
def has_attribute?(name)
attributes.key?(name.to_s)
end
end
示例
a = NonWrapper.new(name: 'engineersmnky')
a.has_attribute?(:name)
#=> true
a.type_for_attribute(:name)
#=> => #<ActiveModel::Type::Value:0x00007fffcdeda790 @precision=nil, @scale=nil, @limit=nil>
注意 像这样的表单对象可能需要添加其他内容才能与 simple_form 一起使用。这个答案简单地解释了如何处理输入映射推断