从Rails中的Hash生成表单3

时间:2011-12-23 10:47:30

标签: ruby-on-rails ruby-on-rails-3 simple-form

我需要从哈希生成一个表单并将其发布回哈希中的params。为此,我创建了这个类。

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 %>

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

如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

使用fields_for,您必须告诉它表单构建应该绑定到什么(除了accepts_nested_attributes_for这是一个完全不同的鱼的情况),即做类似的事情

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

你可能能够逃脱

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

但是,只有当字段可以提取名称时才能直播&#39;从你认为它可以在你的情况下做的对象,因为ActiveModel命名的东西在概念上是一个类级别的东西,而不是一个实例的东西。