Создать форму из хэша в Rails 3 - PullRequest
1 голос
/ 23 декабря 2011

Мне нужно сгенерировать форму из хэша и вернуть ей опубликованные параметры в хэше. для этого я создал этот класс.

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 Ответ

2 голосов
/ 23 декабря 2011

С помощью fields_for вы должны указать, с чем должна связываться сборка формы (за исключением случая accepts_nested_attributes_for, который представляет собой совершенно другой котелок рыбы), то есть сделать что-то вроде

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

Возможно, вам удастся сойти с рук

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

Но только в том случае, если поля for могут извлечь имя 'live' из объекта, что, я не думаю, может в вашем случае, так как ActiveModel именование - это концептуально вещь уровня класса, а не экземпляр экземпляра.

...