Rails表单:按字符串获取对象方法

时间:2013-06-10 17:48:53

标签: ruby-on-rails forms

我正在尝试创建一个动态表单,我从列列表中通过String获取对象方法。

在我看来,我有以下代码:

  <% Contact.columns.each do |column| %>
      <% if column.name.in? ["id", *Contact.accessible_attributes] %>
          <%= f.select column.name, options_for_select(@contacts.first.keys, :include_blank => :true) %>
      <%end%>
    <%end%>

这会给我错误,所以我想如何将String绑定到视图中的方法。

undefined method `id' for #<ContactImport:0x00000003686598>

2 个答案:

答案 0 :(得分:1)

我认为splat运算符会导致问题。 Contact.accessible_attributes会返回一个#<ActiveModel::MassAssignmentSecurity::WhiteList: {}>对象,而splat显然无法操作。

相反,使用to_a将对象渲染为数组,并将id附加到该数组(<<将在适当位置变异)。

<% Contact.columns.each do |column| %>
    <% if column.name.in? Contact.accessible_attributes.to_a << 'id' %>
        <%= f.select column.name, options_for_select(@contacts.first.keys, :include_blank => :true) %>
    <% end %>
<% end %>

答案 1 :(得分:0)

解决方案是使用select_tag。

<%= form_for(@contact_import) do |f| %>
  <% Contact.columns.each do |column| %>
  <% if column.name.in? *Contact.accessible_attributes << 'id' %>
  <%= label_tag column.name %>
<%= select_tag column.name, options_for_select(@contacts.first.keys), :include_blank => true %>
  <%end%>
<%end%>
<%= submit_tag 'Submit' %>
<%end%>

这样我可以根据column.name。

中的String设置字段名称