2017-03-06 4 views
0

J'ai un modèle FormQuestion qui stocke les tags for_for comme des chaînes. Je cherche à avoir quelque chose comme ce qui suit:Interpréter la valeur de chaîne sous la forme de la méthode ruby ​​

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

Comment puis-je obtenir la chaîne retournée de q.input à interpréter comme la balise rubis form_for, plutôt que d'être simplement imprimé sous forme de texte sur la page?

EDIT: eval(q.input) a été suggéré, mais je suis à la recherche d'une alternative plus sûre

+0

try '<% = raw q.input%>' –

+0

@NoamHacker l'a déjà essayé. Il imprime simplement la chaîne – rohaldb

Répondre

0

Vous pouvez utiliser la méthode send comme:

<%= 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

qui devrait probablement être 'f.send (q.input)'. Essayez aussi 'public_send' car' send' a également accès aux méthodes privées. – jvnill

+0

@jvnill oui, j'ai mis à jour ma réponse. –

+0

mais encore, ce n'est pas une réponse complète car @mu est trop court souligné ci-dessus. Si 'q.input' est un tableau, alors cela devrait être' f.send (* q.input) '. – jvnill

0

je changerais cela pour être:

<%= 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 %> 

Ou encore:

<%= 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

Lors de l'utilisation de f.send j'obtiens l'erreur: ' "méthode non définie': champ_texte 'pour # Vouliez-vous dire? text_field "'. J'ai la même erreur pour ': name'. Si je supprime les deux-points, rien ne s'affiche sur la page. – rohaldb

+0

Je voulais utiliser des symboles, par exemple ': text_field', bien que vous puissiez utiliser des chaînes ('text_field'). en d'autres termes, les éléments suivants sont à peu près équivalents. '<% = f.text_field: nom%>', '<% = f.send: champ_texte: nom%>', '<% = f.send 'champ_texte', 'nom'%>' –

+0

Je vois moi aussi aurait dû écrire '<% = f.send q.type, q.name%>' pas '<% f.send q.type, q.name%>' –