fields_for无法传入数组

时间:2011-05-22 19:44:58

标签: ruby-on-rails form-helpers fields-for

我正在尝试对象子集中的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对象似乎工作正常,但似乎数组不会。使fields_for只绘制对象子集的最佳方法是什么?

我看过this similar question,但我认为我不能像has_many那样做关联:shifting_on_day(date)....

编辑添加: 我正在使用MySQL

在REE上运行Rails 3.0.7

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

尝试更换:

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

with:

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

答案 2 :(得分:0)

我不确定,但似乎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