我正在尝试创建一个动态表单,我从列列表中通过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>
答案 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设置字段名称