2011-12-23 9 views
1

ハッシュからフォームを生成し、そのハッシュで投稿されたパラメータを元に戻す必要があります。私はこのクラスを作成しました。Hash in 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 %> 

フォーム

は、適切なフィールド名を正しく生成されますが、唯一の問題は、フィールドがそれらの値を持っていないです。

この問題を解決するにはどうすればよいですか?フォームの構築が(魚の全体の異なるやかんですaccepts_nested_attributes_forの場合を除く)に特異的に結合するべきか、それを伝える必要がありfields_for

答えて

2

、つまりは、あなたができることがあります

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

ような何かを行います

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

で逃げるためには、しかし、唯一のフィールド場合は、私はActiveModel命名ものは概念的にクラスレベルのものですので、それはあなたのケースで行うことができるとは思わないオブジェクトからの「ライブ」名を抽出することができますないインスタンス事。

関連する問題