2011-06-30 13 views
3

テーブルのsettingsフィールドに格納されているハッシュをシリアル化しており、フォームフィールドでそのハッシュを編集できるようにしたいと考えています。シリアル化されたハッシュをフォームで編集しますか?

class Template < ActiveRecord::Base 
    serialize :settings 
end 

しかし、私はちょうど<%= f.text_area :settings %>を行い、その後、テキスト領域だけでシリアライズされたデータの代わりにハッシュを示しています。

ハッシュをテキスト領域に表示するにはどうすればよいですか?

+0

あなたがテキストエリアに表示するために何を期待していますか? '{:foo => 'bar'}'のようなもの? 1つの問題は、フォームにサブミットするときに、アプリケーションにロジックを追加しない限り、設定フィールドがハッシュではなく文字列としてシリアル化されることです。論理は好ましくはモデルに入るべきである。 –

+0

正しい。私は '{:foo => 'bar'}'を見たいと思います。 – Shpigford

答えて

4

のようなものを使用する必要があります。

class Template < ActiveRecord::Base 
    serialize :settings 
    attr_accessor :settings_edit 

    before_save :handle_settings_edit, :if => lambda {|template| template.settings_edit.present? } 

    def settings_edit 
    read_attribute(:settings).inspect # should display your hash like you want 
    end 

    protected 
    def handle_settings_edit 
     # You may want to perform eval in your validations instead of in a 
     # before_save callback, so that you can show errors on your form. 
     begin 
     self.settings = eval(settings_edit) 
     rescue SyntaxError => e 
     self.settings = settings_edit 
     end 
    end 
end 

あなたのフォームには<%= f.text_area :settings_edit %>を使用してください。

私はこのコードをテストしていませんが、理論上は動作するはずです。がんばろう!

警告:このようなevalを使用すると非常に危険です。この例では、編集ボックスTemplate.destroy_allの1行でテンプレートテーブル全体を削除できます。ユーザー入力が含まれている場合は、別の方法を使用して文字列をハッシュに変換します。

+0

Spot on!完璧に動作します。 – Shpigford

+0

実際には...これは動作していないようです。フォームを編集して(UPDATEに)サブミットすると、 'settings'への変更は保存されません。これは以前のデータを保持します。 – Shpigford

+0

何か変更がありましたか? 'attr_accessible'を使っていますか?もしそうなら、あなたは 'settings_edit'への一括割り当てを許可してください。 –

-2

あなたはたぶん働くだろう、あなたのモデルのための別のアクセサを設定

class Template < ActiveRecord::Base 
    serialize :settings, Hash 
end 
+0

text_areaの内容を変更しません – Shpigford

2

...またはあなたが(モデル内の任意のロジックなしで)このようなものを使用することができます

​​
+0

はい、これは動作しますが、新しいキー/値のペアを設定ハッシュ –

+0

うん、これはかなり複雑になります:)このように、設定済みの設定キーを持っていて、キーを追加または削除したくない –

関連する問題