2013-06-04 15 views
7

以下是需要轉換爲hashstring如何在不使用eval的情況下將字符串轉換爲ruby/rails中的散列?

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

我們不能用eval因爲eval將字符串中的執行方法return_misc_definitions('project_status')。是否有純字符串操作來完成ruby/rails中的這種轉換?感謝幫助。

+2

你能舉一個例子,你如何創建一個散列,而不是**在過程中調用該方法? –

+2

如果您使用'eval()',**確保在您嘗試評估的散列**中沒有用戶輸入。設想一個用戶發佈一個像這樣的散列:'{:a => User.delete_all}'! – MrYoshiji

+0

這是什麼用例?你從哪裏得到你的字符串?恕我直言,這不是一個好主意。必須有更好的方式來以更安全的方式輸入數據 – Tilo

回答

9

如前所述,您應該使用eval。你的意見eval執行return_misc_definitions沒有意義。它將以任何方式執行。

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

這兩條線之間沒有功能差異,它們產生完全相同的結果。

h1 == h2 # => true 

當然,如果可以的話,不要使用字符串表示的紅寶石哈希。使用JSON或YAML。他們更安全(不需要eval)。

+0

進一步處理散列輸入並將其用於組成.html.erb上的表單。因此,如果eval在string => hash轉換期間爲該方法開始工作,那麼我們將從rails中產生語法錯誤。 – user938363

+1

顯示一個例子。 –

+0

<%= simple_form_for model,:method =>:put,:url => search_results_url do | f | %> <%= fields_details.each do | field,layouts | %> <%= f.input field,layouts%> <% end %> <% end %> – user938363

相關問題