序列化哈希字段和简单表单

我有以下内容。

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(不想指定对象的名称)。

我会看看我是否可以为此编写一个像样的简单表单扩展。

我遇到了一个类似的问题,试图在Mongoid模型的Hash字段类型上使用simple_fields_for。 我正在处理的示例的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内容混合到我的视图中,我为simple_form创建了一个猴子补丁,以便在simple_form中自动包装散列类型并将其放入初始化器中:

 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 

现在我可以使用我原来天真的解决方案而无需特殊的视图代码。

使用OpenStruct 。 它的工作原理如下:

 require 'ostruct' struct = OStruct.new("address" => "8 finance street, hong kong", "founded" => "1973") struct.address # => 8 struct.founded # => "1973" 

这是一个可以轻松适应您的问题的解决方案:

https://gist.github.com/2157877

使表单保持超级清洁并保持活动模型的正常行为(在控制器中无需添加任何内容)。

干杯!

如果我之前只发现这篇文章,我就不会错过这个问题的三天。

我无法对answear发表评论,只是为了补充一下,如果有人尝试使用fields_for mongo数组哈希(has_many like),你还需要提供带有"#{key}_attributes="的根OpenStruct对象(在这种情况是fields_attributes =)方法,所以fields_for会识别它是has_many关系。

希望它可以帮助某人;)