4

会社モデルにシリアル化された列があります。

class Company < ActiveRecord::Base
  serialize :names

理想的には、次のようなさまざまな名前をデータベースに保存する必要があります。

---
short: bestbuy
long: bestbuy ltd.

現在、私のcompany#editページに、次のテキスト領域があります。

<%= f.text_area :names %>

データベースにそのYAMLがある場合、ブラウザーには次のように表示されます。

{"short"=>"bestbuy", "long"=>"bestbuy ltd."}

しかし、私がそれを提出すると、データベースでは次のようになりました。

--- ! '{"short"=>"bestbuy", "long"=>"bestbuy ltd."}'

質問

textareaが編集者が編集できるYAMLを表示するようにするにはどうすればよいですか?

YAMLとルビーハッシュのマッシュではなく、データベースに適切なYAMLを保存させる方法は?

アップデート

Hash列を次のようなタイプに強制すると、次のようになります。

serialize :names, Hash

保存しようとするとエラーが発生します:

Admin::CompaniesController#updateのActiveRecord::SerializationTypeMismatch
属性はハッシュであるはずでしたが、文字列でした

4

3 に答える 3

4

生の SQL を使用して手動でデータベースをいじることはできますが、自分が何をしているのかまだわからない場合はお勧めしません。当然のことながら、自分が何をしているのかを正確に把握していない限り、データベースのバージョンの YAML をいじってはいけません。

代わりに、データを自分で YAML に変換します。

@names = m.names.to_yaml

そしてあなたの中に詰め込み@namesます<textarea>。次に、編集した YAML を保存するために、それを解析してハッシュに戻し、モデルに渡します。

m.names = YAML.parse(params[:names])

# Or modify `params` in-place
params[:name] = YAML.load(params[:names])
# then stuff `params` into `m` as usual

ある程度安全にするためnamesに、モデル内のハッシュであることを指定する必要があります。

serialize :names, Hash

私は大ファンではないserializeので、通常は使用しないことをお勧めします。ただし、これを使用する場合は、class_nameより安全に使用できるように常に を指定する必要があります。


あなたの現在のアプローチはto_s、あなたのハッシュのバージョンを<textarea>:

{"short"=>"bestbuy", "long"=>"bestbuy ltd."}

これはハッシュではなく文字列です。ハッシュのように見えるかもしれませんが、HTML は Ruby ハッシュが何であるかを認識しないため、単なる文字列です。次に、それを読み込んでnames、YAML化して(文字列として)これに入れます:

--- ! '{"short"=>"bestbuy", "long"=>"bestbuy ltd."}'

これは YAML の文字列で、ハッシュによく似た文字列ですが、それでも文字列です。

于 2012-04-27T06:32:48.427 に答える
0

私自身の質問に対する遅い答え:

class ConfigSerializer
  def self.load(i)
    if i.blank?
      {}
    else
      YAML.load(i)
    end
  end

  def self.dump(i)
    i = {} if i.blank?

    if i.is_a?(String) # Allow assigning an YAML string as input 
      i
    else
      YAML.dump(i)
    end
  end
end

そしてモデルで

serialize :names, ConfigSerializer

このようにして、YAML 文字列を割り当てることができ、そのままデータベースに保存されます。データベースからロードされた場合にのみ、ハッシュ オブジェクトに変換されます。

ビューでは、textarea に未加工の YAML 文字列を設定して、ユーザーが編集できるようにします。

于 2016-02-23T02:01:30.317 に答える
-2

次のように名前をdbに保存してみてください:

names = HashWithIndifferentAccess.new({"short"=>"bestbuy", "long"=>"bestbuy ltd."})
company = Company.new
company.names = names.to_yaml

願っています、それは役に立ちます。

于 2012-04-27T05:59:38.497 に答える