2011-01-21 16 views
3

serializeメソッドを使用すると、ハッシュのようなオブジェクトをYAML文字列としてデータベースに格納できます。しかし、私は最近、ユーザーが自分の文字列を入力してコントローラがその文字列からハッシュを作成できるようにするテキストフィールドを必要としていることがわかりました。テキストフィールドからのYAMLの取得

<%= f.text_field :yaml, :value => '--- \nlast_name: Smith\nfirst_name: Joe\n' %> 

はい、一重引用符を使用したいと思います。\ nをディスプレイに保存します。しかし、問題は、結果として、結果の文字列オブジェクトがエスケープします、ということである:

--- \\nlast_name: Smith\\nfirst_name: Joe\\n 

私は2つの正規表現による文字列を実行します。最初は、単一のバックスラッシュと二重のバックスラッシュを置き換えます。次に\ n(2文字)を\ n(特殊1文字)に変換します。だから私のコントローラで

yhash = YAML.load(params[:form][:yaml].gsub(/\\\\/, "\\").gsub(/\\n/, "\n")) 

は、この機能するようになりましたが、とても複雑なようです。ユーザーがyamlを送信するためのよりエレガントな方法はありますか?

+0

これをより簡潔に言い換えることができますか? –

+1

あなたはこれをやりたい理由を説明できますか? Railsはセキュリティ侵害を避けるためにこのテキストをエスケープします。ユーザーからのデータ構造を作成してシリアルコードを入力し、それを危険にさらす可能性があります。これのためのユースケースのように思えます。 –

+0

+1私は同意します。そこには本当の "悪用"の悪臭があります。 –

答えて

0

あなたは入力したyamlに改行をマークするためにユーザが\nと書くことができると言っていますか?その場合、正規表現を使用して今行っている方法はとても簡単です。

エスケープシーケンス\nは、Ruby文字列の機能です。 Webフォームのyamlインターフェースに実装したい場合は、regexpが有効な方法です。

本当にダブルスラッシュの交換が必要ですか? .inspectの場合はダブルスラッシュで表示されるはずです。

関連する問題