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 に答える