has_many,多态关联和fields_for

时间:2014-04-03 20:16:34

标签: ruby-on-rails-4 associations nested-forms

修改

我错过了accepts_nested_attributes_for中的ScheduleTemplates

我将这里留给后人和我的耻辱墙


我的上一个问题是在凌晨4点问到的,所以我想我会再试一次。

我在这里有3个型号。 UserScheduleTemplateDayBlock。这里的目标是一个调度应用程序,它允许每个用户拥有不同的调度模板,在这些模板中,他们有可用的工作开始和结束时间。他们可以根据需求的变化(de)激活模板。

我还有3种类型的时间表

  • BaseSchedule(充当原始可用性)
  • ScheduleTemplate(他们的偏好)
  • Schedule(本周的比赛时间表)

因此,我决定制作DayBlock多态:as => :schedulable

创建用户后,我有一个after_create回调来创建基本和模板计划对象(每个用户都需要并使用它)。

## ScheduleTemplatesController.rb
after_create :generate_default_schedules
has_one :schedule_template
has_one :base_schedule

accepts_nested_attributes_for :base_schedule, :schedule_template, reject_if: :all_blank

## User.rb
def generate_default_schedules
  @base ||= BaseSchedule.new(:user => self)
  @template ||= ScheduleTemplate.new(:user => self, :mutable_type => 1)

  build_schedules(@base, @template)
end

## ScheduleHelper.rb
def build_schedules(*schedules)
  schedules.each do |schedule|
    build_days_for(schedule).save!
  end
end

def build_days_for(schedule)
  7.times {|i| schedule.day_blocks.build({
        :schedulable_id => schedule, 
        :from => "0600", 
        :to => "0200", 
        :day_index => i
    })}
  schedule
end

我知道这样可以正常工作,因为以下输出显示在我的new.html.erb文件中,我希望在每个day_block中编辑表单:

<%= debug @schedule.day_blocks %>

---
- !ruby/object:DayBlock
  attributes:
    id: 8
    schedulable_id: 1
    schedulable_type: ScheduleTemplate
    day_index: 0
    from: '0600'
    to: '0200'
- !ruby/object:DayBlock
  attributes:
    id: 9
    schedulable_id: 1
    schedulable_type: ScheduleTemplate
    day_index: 1
    from: '0600'
    to: '0200'
 .... more

在我的ScheduleTemplatesController #new操作中:

def new 
  @user = current_user
  @schedule = current_user.schedule_template
end

到目前为止非常基本的东西。

pisser带有以下形式:

<%= form_for @schedule, :url => user_schedule_templates_path do |schedule| %>
  <%= schedule.fields_for :day_blocks do |day| %>
    <%= day.label :from %>
    <%= day.text_field :from %>
  <% end %>
<% end %>

当我想要所有7个时,我得到一个标签,一个文本字段。我不明白为什么我可以调试所有7天_blocks,但是当涉及到fields_for时,它只显示一个。

我在这里完全失败了,希望有人可以对此有所了解!它让我发疯了!

0 个答案:

没有答案
相关问题