Подопределенный метод "id" для collection_select - PullRequest
0 голосов
/ 11 декабря 2011

Я получаю следующую ошибку:

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

Теперь язнать, о чем вы думаете, есть ли у вас has_many через отношения и т. д., но на самом деле настройка в данный момент (потому что она находится в первых итерациях) очень проста, и фактически имитирует настройку других типов на той же странице, котораяработать просто отлично.На той же странице у меня есть это:

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

И на самом деле модель точно такая же, только с другим названием.Оба имеют только идентификатор и поле имени.На самом деле, даже отношения в модели абсолютно одинаковы.Есть бронирование, клиент и сотрудник.Клиент has_many: заказы, а "персонал" has_many: заказы.Единственное отличие, которое я действительно вижу, это то, что я использую inflections.rb для выполнения следующих действий:

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

Есть идеи, почему я не могу заставить это работать?

РЕДАКТИРОВАТЬ

Честно говоря, я думаю, что это связано с belongs_to :staff в booking.rb модели.Это как-то связано с многовариантным ИМО.

РЕДАКТИРОВАТЬ, РЕДАКТИРОВАТЬ

Точнее говоря, следующая форма отлично работает:

<%= 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 голосов
/ 11 декабря 2011

Это была странная проблема, которую я должен был заметить ранее.

<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 помощников. По какой-то причине я просто запутался, поскольку делал это много раз раньше. Привет, теперь это работает Почему ошибка не жаловалась на второй collection_select Я не знаю.

Если вы столкнулись с указанной мной ошибкой, возможно, это потому, что у вас есть несколько помощников, пытающихся решить одну и ту же проблему. Я не видел, чтобы это было опубликовано где-то еще в сети, но это исправлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...