fields_for невозможно передать в массив - PullRequest
2 голосов
/ 22 мая 2011

Я пытаюсь сделать fields_for подмножества объектов и борюсь с некоторыми.Вот некоторые детали:

class Club < ActiveRecord::Base
  has_many :shifts
...

<%= form_for club, :url => shift_builders_url do |f| %>
...      
<% these_shifts = Shift.where(:club_id => club.id, :date => date) %>
<%= f.fields_for :shifts, these_shifts do |s| %>
  <td><%= render "shift_fields", :f => s %></td>
<% end %>
...

Таким образом, этот код работает в основном так, как ожидалось, хотя очевидно, что делать эти вызовы в представлении ужасно.Чтобы очистить код, я добавил следующий код контроллера:

...
@shifts_by_club_and_date = sort_shifts_by_club_and_date(@shifts)
...

private

def sort_shifts_by_club_and_date(shifts)
  return_hash = Hash.new
  shifts.each do |s|
    return_hash["#{s.club_id}-#{s.date}"] ? return_hash["#{s.club_id}-#{s.date}"] << s : return_hash["#{s.club_id}-#{s.date}"] = [s]
  end
  return return_hash
end

Затем, когда я это сделаю:

<%= form_for club, :url => shift_builders_url do |f| %>
...      
<% these_shifts = @shifts_by_club_and_date["#{club.id}-#{date}"] %>
<%= f.fields_for :shifts, these_shifts do |s| %>
  <td><%= render "shift_fields", :f => s %></td>
<% end %>
...

Вместо того, чтобы принять этот массив, он делает что-то вроде:

Shift Load (7.3ms)  SELECT `shifts`.* FROM `shifts` WHERE (`shifts`.club_id = 2)

А затем рисует поля для каждого отдельного объекта сдвига для этого клуба ... Передача в объект Arel, кажется, работает нормально, но массив, кажется, не работает.Каков наилучший способ иметь поля для рисования только подмножества объектов?

Я смотрел на этот похожий вопрос , но я не думаю, что смогу сделать ассоциацию как has_many: shifts_on_day (date) ....

Редактировать, чтобы добавить: Я использую Rails 3.0.7 на REE с MySQL

Ответы [ 3 ]

1 голос
/ 23 мая 2011
<%= form_for club, :url => shift_builders_url do |f| %>
...      
<% these_shifts = club.shifts_for_date(some_date) %>
<%= f.fields_for :shifts, these_shifts do |s| %>
  <td><%= render "shift_fields", :f => s %></td>
<% end %>

Модель

class Club < AR::Base
  has_many :shifts
  ...
  def shifts_for_date(date)
    shifts.where(:date => date)
  end
  ...
end
0 голосов
/ 01 октября 2015

Я не уверен, но кажется, что these_shifts не то, что вы ожидаете, тогда, когда fields_for анализирует аргументы, он проверяет, что там что-то есть, и не находит то, что вы ищете, это делает call(:shields) в клубе, как вы, где f.fields_for :shields, nil do |s|.(см. https://github.com/rails/rails/blob/30c67000cab2284689bd93f25937c088d1ec6e74/actionview/lib/action_view/helpers/form_helper.rb#L1943)

0 голосов
/ 23 мая 2011

попробуйте заменить:

<%= f.fields_for :shifts, these_shifts do |s| %>
  <td><%= render "shift_fields", :f => s %></td>
<% end %>

с:

<% for shift in these_shifts do %>
 <td><%= f.field_for :shift %></td>
<% end %>
...