【问题标题】:Interpret string value as ruby method将字符串值解释为 ruby​​ 方法
【发布时间】:2017-03-06 03:34:22
【问题描述】:

我有一个 FormQuestion 模型,它将 form_for 标签存储为字符串。 我正在寻找类似以下的内容:

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

如何将 q.input 返回的字符串解释为 form_for ruby​​ 标记,而不是简单地打印为页面上的文本?

编辑: 有人建议eval(q.input),但我正在寻找更安全的替代方案

【问题讨论】:

  • 试试&lt;%= raw q.input %&gt;
  • @NoamHacker 已经尝试过了。它只是打印字符串

标签: ruby-on-rails ruby forms form-for


【解决方案1】:

您可以将send 方法用作:

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

【讨论】:

  • 应该是f.send(q.input)。也可以试试public_send,因为send 也可以访问私有方法。
  • 但是,这仍然不是一个完整的答案,因为上面指出@mu 太短了。如果q.input 是一个数组,那么它应该是f.send(*q.input)
  • " 未定义方法`f.text_field :name' "
【解决方案2】:

我会将其更改为:

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

否则:

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

【讨论】:

  • 使用 f.send 时出现错误:"undefined method ':text_field' for #&lt;ActionView::Helpers::FormBuilder:0x007ffd63658c50&gt; Did you mean? text_field" 。对于:name,我得到了同样的错误。如果我删除冒号,则页面上不会显示任何内容。
  • 我的意思是使用符号,即:text_field,尽管您可以使用字符串('text_field')。换句话说,以下大致等价。 &lt;%= f.text_field :name %&gt;, &lt;%= f.send :text_field :name %&gt;, &lt;%= f.send 'text_field', 'name' %&gt;
  • 我知道我也应该写&lt;%= f.send q.type, q.name %&gt;而不是&lt;% f.send q.type, q.name %&gt;
猜你喜欢
  • 2013-06-09
  • 2020-12-15
  • 2019-05-18
  • 1970-01-01
  • 2015-11-06
  • 2011-12-23
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
相关资源
最近更新 更多