2013-06-04 8 views
7

hash ürününe dönüştürmek için gereken string İşte.Değerlendirmeden bir dizgeyi ruby ​​/ raylarda bir karmaşaya dönüştürme nasıl?

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

Biz dizede yöntemi return_misc_definitions('project_status') çalıştırır evaleval çünkü kullanamazsınız. Ruby/raylarda bu dönüşümü gerçekleştirmek için saf dizi işlemi var mı? Yardım için teşekkürler.

+2

Bir örnek gösterebiliyorsunuz, bu yöntemde nasıl bir karma oluşturabilir ve ** bu yöntemi çağırmıyorsunuz? –

+2

Eğer 'eval()' işlevini kullanırsanız, ** değerlendirmeyi yapmaya çalıştığınız hash ** 'da kullanıcının girişi olmadığından emin olun. Bir kullanıcının bu gibi bir karma gönderdiği düşünün: '{: a => User.delete_all}'! – MrYoshiji

+0

Bunun için kullanım durumu nedir? Dize nereden geliyor? IMHO bunu yapmak için iyi bir fikir değil. Verileri daha güvenli bir şekilde girmenin daha iyi bir yolu olmalı – Tilo

cevap

9

Daha önce bahsedildiği gibi, eval kullanmalısınız. return_misc_definitions'u uygulayan eval noktanız anlam ifade etmiyor. Her iki şekilde de yapılacaktır.

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

Bu iki satır arasında işlevsel bir fark yoktur, tam olarak aynı sonucu üretirler.

h1 == h2 # => true 

Elbette, eğer yapabilirseniz, ruby ​​karmalarının dizgi temsili özelliğini kullanmayın. JSON veya YAML kullanın. Çok daha güvenliler (eval gerektirmez).

+0

Karma girdi daha ileri işleme vardır ve form oluşturmak için kullanın .html.erb. Dolayısıyla, string string => hash dönüşümü sırasında yöntem için başlıyorsa, raylardan sözdizimi hatası alacağız. – user938363

+1

Bir örnek göster. –

+0

<% = simple_form_for model,: yöntem =>: koy,: url => search_results_url do | f | %> <% = fields_details.each do | alan, düzenler | %> <% = f.input alanı, düzenler%> <% end %> <% end %> – user938363