我需要从哈希生成一个表单并将其发布回哈希中的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 %>
使用正确的字段名称正确生成表单,但只有问题是字段中没有值。
如何解决这个问题?
答案 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
命名的东西在概念上是一个类级别的东西,而不是一个实例的东西。