2013-06-04 17 views
7

stringhashに変換する必要があります。evalを使用せずに文字列をルビ/レールのハッシュに変換するには?

"{:status => {:label => 'Status', :collection => return_misc_definitions('project_status') } }" 

私たちは、文字列内のメソッドreturn_misc_definitions('project_status')を実行しますevalevalために使用することはできません。ルビ/レールでこの変換を行うための純粋な文字列操作はありますか?手伝ってくれてありがとう。

+2

ハッシュを作成して**そのメソッドをそのプロセスで呼び出さない**という例を示すことができますか? –

+2

'eval()'を使うと、**あなたが評価しようとしているハッシュ**にユーザーの入力がないことを確認してください。ユーザーが '{a => User.delete_all}'のようにハッシュを投稿したとします。 – MrYoshiji

+0

これのユースケースは何ですか?どこから文字列を取得しますか? IMHOこれを行うのは良い考えではありません。 – Tilo

答えて

9

前述のとおり、evalを使用してください。あなたのポイントは約evalreturn_misc_definitionsを実行することは意味がありません。いずれかの方法で実行されます。

h1 = {:status => {:label => 'Status', :collection => return_misc_definitions('project_status') } } 
# or 
h2 = eval("{:status => {:label => 'Status', :collection => return_misc_definitions('project_status') } }") 

これらの2つの行に機能的な違いはなく、まったく同じ結果が得られます。

h1 == h2 # => true 

もちろん、可能であれば、ruby hashesの文字列represenstationを使用しないでください。 JSONまたはYAMLを使用します。彼らははるかに安全です(evalを必要としません)。

+0

さらにハッシュ入力の処理があり、それを.html.erbのフォームを構成するために使用します。したがって、string =>ハッシュ変換中にメソッドのevalが実行された場合は、レールから構文エラーが発生します。 – user938363

+1

例を示します。 –

+0

<%= simple_form_for model、:method =>:put、:url => search_results_url do | f | %> <%= fields_details.each do |フィールド、レイアウト| %> <%= f.inputフィールド、レイアウト%> <% end %> <% end %> – user938363

関連する問題