2017-03-06 6 views
0

Ich habe ein FormQuestion-Modell, das Form_for Tags als Zeichenfolgen speichert. Ich suche so etwas wie die folgenden haben:Interpretieren String-Wert als Ruby-Methode

<%= form_for(application_form) do |f| %> 
    <% FormQuestion.all.each do |q| %> 
    <%= q.input %> #where q.input = "f.text_field :name" 
    <% end %> 
<% end %> 

Wie kann ich die Zeichenfolge aus q.input zurück als form_for Rubin Tag interpretiert werden, anstatt einfach als Text auf der Seite gedruckt werden?

EDIT: eval(q.input) vorgeschlagen wurde, aber ich bin auf der Suche für eine sicherere Alternative

+0

probiere '<% = rohe q.input%>' –

+0

@NoamHacker probierte das bereits aus. Es druckt nur die Zeichenfolge – rohaldb

Antwort

0

Sie send Methode verwenden können, wie:

<%= form_for(application_form) do |f| %> 
    <% FormQuestion.all.each do |q| %> 
    <%= f.send(q.input) %> #where q.input = "f.text_field :name" 
    <% end %> 
<% end %> 
+1

, die wahrscheinlich 'f.send (q.input)' sein sollte. Versuchen Sie auch 'public_send', da' send' auch Zugriff auf private Methoden hat. – jvnill

+0

@jvnill ja, ich habe meine Antwort aktualisiert. –

+0

aber immer noch, das ist keine vollständige Antwort als @mu ist zu kurz oben hingewiesen. Wenn 'q.input' ein Array ist, dann sollte das' f.send (* q.input) 'sein. – jvnill

0

Ich würde dies ändern entweder:

<%= form_for(application_form) do |f| %> 
    <% FormQuestion.all.each do |q| %> 
    <% f.send q.type, q.name %> #where q.type = :text_field and q.name = :name 
    <% end %> 
<% end %> 

Oder sonst:

<%= form_for(application_form) do |f| %> 
    <% FormQuestion.all.each do |q| %> 
    <%= raw q.as_html %> # where q.as_html = "<input name="name"></input>" 
    <% end %> 
<% end %> 
+0

Bei der Verwendung von f.Send bekomme ich den Fehler: ' "undefined Methode': text_field 'für # Meinten Sie? text_field "'. Ich bekomme den gleichen Fehler für ': name'. Wenn ich die Doppelpunkte entferne, wird nichts auf der Seite angezeigt. – rohaldb

+0

Ich wollte Symbole verwenden, i..e, ': text_field', obwohl Sie Strings ('text_field') verwenden könnten. Mit anderen Worten, das Folgende ist ungefähr gleichwertig. '<% = f.text_field: name%>', '<% = f.send: text_field: name%>', '<% = f.send 'text_field', 'name'%>' –

+0

Ich sehe ich auch sollte geschrieben haben: <% = f.send q.type, q.name%> 'nicht' <% f.send q.type, q.name%> ' –

Verwandte Themen