0

Rails 3.0 アプリで、ユーザーが最大 5 つのキーワードと値のペアを作成して単一のフィールドに格納できるフォーム要素を追加したいと考えています。キーワードはアプリではなくユーザーによって定義されるため、私が調査した他のSOの質問は機能しません。これらの例では、コードが事前にキーを「知っている」必要があるためです。

キーは常に 1 つの単語であり、値は常に 1 つの短い文です。

したがって、1 人のユーザーは、{'snow' => 'I like snow', 'ski' => 'I like to ski'} に相当するものを入力したいと思うかもしれません。

{'red' => '私の好きな色は赤です', 'yellow' => '黄色い雪を食べないでください'}

モデルの serialize :options, Hash をデータベースに使用して、単一のテキスト フィールドにハッシュを格納/取得する方法を取得します。

私が得られないのは、ユーザーが実際にjsonまたはハッシュ形式でtext_areaフィールドに入力しなくても、ハッシュを作成/編集できるようにする簡単な方法です。

BRUTE FORCE: 私は固定された少数の許可されたペア (5) を持っているので、私の見解では、0 ~ 5 のペアを入力するための 10 のフィールドを提供し、フォームを保存してロジックを表示し、何らかの方法でペアを移動します。それらの10フィールド。しかし、これらの 10 個のフィールドをシリアル化されたデータとの間でマッピングするロジックがわかりません。どんな助けでも大歓迎です。

ELEGANT: もちろん、hash-edit フォーム要素を動的に生成する方法はさらに優れています。(Rails 3.2にはその機能があると読んだと思いますが、これは多くの可動部分(複数の外部サービスとの統合)を備えた大規模で複雑なアプリであるため、現在アップグレードすることはできません。そのため、新しいRailsに更新する予定はありません4~6ヶ月。)

4

1 に答える 1

1

レシピではなく、ほんの少しのヒントです。

強引な:

モデルに 10 個の仮想属性を作成します ( key1, value1, key2, value2, ...)

ActiveRecord コールバックを使用してハッシュをシリアライズ/デシリアライズする

class YourModel < ActiveRecord::Base
  attr_accessor :key1, :value1, :key2, :value2, ...
  attr_accessible :key1, :value1, :key2, :value2, ...

  after_initialize do |obj|
    #map pairs to virtual attributes
    unless obj.pairs.nil?
      i=1
      pairs.each_pair do |key, val|
        obj.instance_variable_set("@key#{i}", key)
        obj.instance_variable_set("@value#{i}", val)
        i += 1
      end
    end
  end

  before_save do |obj|
    #serialize top hash
  end
end

2 番目の方法:

必須フィールドを生成するカスタム フォーム ビルダーを作成します (ここでは、ラジオ ボタンの例を示します - ラジオ ボタンリストのレール カスタムフォームビルダーの例です。フォーム ビルダーに関するいくつかのスクリーンキャストとチュートリアルを簡単に見つけることができます)。

于 2012-08-02T09:32:16.237 に答える