0

我正在尝试创建一个动态表单,在其中通过列列表中的字符串获取对象方法。

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

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

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

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

2 回答 2

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 %>
于 2013-06-10T19:08:23.867 回答
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 中的字符串设置字段名称。

于 2013-06-13T20:15:05.347 回答