我有以下内容。
class Page < ActiveRecord::Base
belongs_to :category
serialize :fields
end
fields
的值将取决于类别。但作为一个例子;{"address" => "8 finance street, hong kong",
"founded" => "1973"}
在这个例子中,类别定义了
"address"
和 "founded"
作为自定义字段。我想说的是;
= simple_form_for(@page) do |f|
= f.association :category
- f.object.category.fields.each do |field|
= f.input field.name
但我需要做一些魔法来处理
@page.founded
的事实。无效相反,我应该查看
@page.fields["founded"]
.有什么建议?
更新:
我稍微靠近了一点
- if f.object.category
- f.object.category.fields.each do |field|
= f.input field.name do
= text_field_tag "post[fields][#{field.name}]", f.object.fields[file.name]
现在需要制作这个DRYer(不想指定对象的名称)。
我会看看我是否可以为此编写一个像样的简单表单扩展。
最佳答案
我在尝试使用 simple_fields_for
时遇到了类似的问题在 Mongoid 模型的 Hash 字段类型上。我正在处理的示例的 Mongoid 版本如下所示:
class Page
include Mongoid::Document
field :fields, type: Hash
end
不过,我的情况可能略有不同,因为我已经提前知道我正在寻找的哈希键,而且只需要
simple_fields_for
使用哈希字段。我使用的幼稚方法(基本 fields_for
用法)如下所示:= simple_form_for(@page) do |f|
= f.simple_fields_for :fields do |ff|
= ff.input :address
= ff.input :founded
但这并没有正确填充表单。 nicholaides 将散列包装在结构中的解决方案对我有用:
- require 'ostruct'
= simple_form_for(@page) do |f|
= f.simple_fields_for :fields, OpenStruct.new(@page.fields) do |ff|
= ff.input :address
= ff.input :founded
为了避免将 OpenStruct 的东西混入我的 View 中,我为
simple_form
创建了一个猴子补丁。自动将散列类型包装在 OpenStruct 中并将其放入初始化程序:require 'ostruct'
module SimpleForm::ActionViewExtensions::Builder
def simple_fields_for_with_hash_support(*args, &block)
if args[0] && !args[1]
field = object.send(args[0])
args << OpenStruct.new(field) if field.respond_to?(:has_key?)
end
simple_fields_for_without_hash_support(*args, &block)
end
alias simple_fields_for_without_hash_support simple_fields_for
alias simple_fields_for simple_fields_for_with_hash_support
end
现在我可以在没有特殊 View 代码的情况下使用我原来的天真解决方案。
关于ruby-on-rails - 序列化哈希字段和简单表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9613208/