collection_select的未定义方法“id”

时间:2011-12-10 21:47:06

标签: ruby-on-rails

我收到以下错误:

undefined method `id' for #<Array:0x00000101ff0b70>

在这一行:

<%= collection_select(:staff, :id, @staff, :id, :name, options ={:prompt => "-Select a staff member"}) %>

这是行动方法:

def new
  @treatments = Treatment.all
  @clients = Client.all
  @staff = Staff.all

  @booking = Booking.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @booking }
  end
end

现在,我知道你在想什么,你有没有通过关系等等,但实际上目前的设置(因为它在第一次迭代中)非常简单,实际上模仿了其他的工作得很好的同一页面上的类型。在同一页面上我有这个:

<%= collection_select(:client, :id, @clients, :id, :name, options ={:prompt => "-Select a client"}) %>

事实上,除了名称不同之外,模型完全相同。两者都只有ID和名称字段。事实上,即使模型中的关系也完全相同。有预订,客户和工作人员。客户has_many:预订,以及“员工”has_many:预订。唯一不同的是我真正看到的是我正在使用inflections.rb执行以下操作

ActiveSupport::Inflector.inflections do |inflect|
    inflect.uncountable "staff"
end

为什么我不能让它发挥作用的任何想法?

修改

老实说,我认为这与belongs_to :staff模型中的booking.rb有关。这与多元化IMO有关。

编辑编辑

更具体地说,以下表格可以正常使用:

<%= form_for(Booking.new) do |f| %>
        <div class="field">
            <%= f.label :treatment %><br />
            <%= collection_select(:treatment, :id, Treatment.all, :id, :name, options ={:prompt => "-Select a treatment"}) %>
          </div>
          <div class="field">
            <%= f.label :client %><br />
            <%= collection_select(:client, :id, Client.all, :id, :name, options ={:prompt => "-Select a client"}) %>
          </div>
          <div class="field">
            <%= f.label :staff %><br />
            <%= collection_select(:staff, :id, Staff.all, :id, :name, options ={:prompt => "-Select a staff member"}) %>
          </div>
          <div class="actions">
            <%= f.submit %>
          </div>
<% end %>

但以下表格不是:

<%= form_for([:admin, @booking]) do |f| %>
  <% if @booking.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@booking.errors.count, "error") %> prohibited this booking from being saved:</h2>

      <ul>
      <% @booking.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :treatment %><br />
    <%= collection_select(:treatment, :id, @treatments, :id, :name, options ={:prompt => "-Select a treatment"}) %>
  </div>
  <div class="field">
    <%= f.label :client %><br />
    <%= collection_select(:client, :id, @clients, :id, :name, options ={:prompt => "-Select a client"}) %>
  </div>
  <div class="field">
    <%= f.label :staff %><br />
    <%= collection_select(:staff, :id, @staff, :id, :name, options ={:prompt => "-Select a staff member"}) %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

@staff变量只是通过执行@staff = Staff.all

在控制器操作中生成

有任何解释吗?

1 个答案:

答案 0 :(得分:0)

这是一个奇怪的问题,我应该早点发现。

<div class="field">
    <%= f.label :treatment %><br />
    <%= collection_select(:booking, :treatment_id, @treatments, :id, :name, options ={:prompt => "-Select a treatment-"}) %>
  </div>
  <div class="field">
    <%= f.label :client %><br />
    <%= collection_select(:booking, :client_id, @clients, :id, :name, options ={:prompt => "-Select a client-"}) %>
  </div>
  <div class="field">
    <%= f.label :staff %><br />
    <%= collection_select(:booking, :staff_id, @staff, :id, :name, options ={:prompt => "-Select a staff member-"}) %>
  </div>

需要为预订指定collection_select助手。出于某种原因,我刚刚搞砸了,因为我之前做了很多次。嘿presto,它现在有效。为什么错误没有抱怨我不知道的第二个collection_select

如果您遇到我指定的错误,可能是因为您有多个帮助程序试图解决同样的问题。我没有看到这张贴在互联网上的任何其他地方,但它是固定的。