1

我正在尝试使用哈希来显示表单:

PREFIX_STR = "Prefix"
FIRST_STR = "First Name"

NEW_USER_HASH = Hash.new
NEW_USER_HASH[ "prefix" ] = { "label" => PREFIX_STR, "type" => "text_field" }
NEW_USER_HASH[ "first" ] = { "label" => FIRST_STR, "type" => "text_field" }

在 new.html.erb 中,我有:

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <% NEW_USER_HASH.each do |column_name,field_info|  %>
    <div class="field">
      <%= f.label field_info["label"] %>
      <%= f.text_field column_name %>
    </div>
  <% end %>

这很好用,但我希望它不是 f.text_field,而是 field_info [“type”] 中的内容。我试过的都没有用。有任何想法吗?

谢谢

4

1 回答 1

2

你可以试试f.send(field_into["type"], column_name)

(编辑删除“ to_sym”,评论者告诉我这是不必要的(我认为是send必需的符号。)

为什么这样有效: some_object.send("hello")只是另一种写作方式some_object.hello。在 Ruby 中,在对象上调用“方法”实际上是消息传递的一种形式——您正在向该对象发送消息,而对象将其解释为方法调用(或不解释)——使用 ruby​​ 元编程看起来不需要方法调用)。

在这种情况下,您有一个f表示对象的form_helper对象,因此当您调用 时f.text_field,您正在向该对象发送消息。通过使用f.send,您可以执行相同的操作,只是您可以动态生成该消息的内容。

于 2012-05-14T02:05:45.763 回答