2011-12-23 111 views
1

我需要从哈希表中生成一个表单并将其返回到其发布的参数中。为此,我创建了这个类。在Rails 3中生成哈希表格

class Hashit 
    include ActiveModel::Conversion 
    extend ActiveModel::Naming 

    def initialize(hash) 
    hash.each do |k, v| 
     self.class.send(:attr_accessor, k.to_sym) 
     if v.class.name == "ActiveSupport::HashWithIndifferentAccess" 
     self.send("#{k}=", Hashit.new(v)) 
     else 
     self.send("#{k}=", v) 
     end 
    end 
    end 
    def persisted? 
    true 
    end 
end 

现在例如我有一个settings散列。 {:live=>{:title=>"Live Title"}, :staging=>{:title=>'Staging Title'}} 将其转换为@settings_obj = Hashit.new(settings)的对象,然后使用simple_form为其生成表单。

<%= simple_form_for @settings_obj, :url => app_settings_url do |f| %> 
    <%= f.fields_for :live do |l| %> 
     <%= l.input :title %> 
    <% end %> 
    <%= f.fields_for :staging do |s| %> 
     <%= s.input :title %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 

使用适当的字段名称正确生成表格,但只有问题是字段中没有值。

如何解决这个问题?

回答

2

随着fields_for你必须告诉它什么形式构建应该结合(除了在accepts_nested_attributes_for的情况下,这是鱼完全不同水壶),即做这样的事情

<%= f.fields_for :live, f.object.live do |l|%> 

你也许能够逃脱

<%= f.fields_for f.object.live %> 

但仅当可以提取我不认为它可以在你的情况做自ActiveModel命名的东西在概念上是一流水平的东西的名字从对象“活”领域,不是实例的东西。