使用Rails将日历转换为表单?

时间:2011-11-10 18:34:06

标签: ruby-on-rails ruby calendar ruby-on-rails-3.1 nested-forms

问题:如何将日历转换为呈现日期选择以匹配日历日而非当前日期的表单?


我正在尝试做什么: 我想创建一个显示骑车人锻炼的日历。

  • 在每个日历日内创建锻炼,自动呈现与表格中的给定日期匹配的锻炼日期

每次锻炼都有很多间隔。每个日历日都有一次锻炼。

插件:https://github.com/p8/table_builder中提取table_builder.rb和calendar_helper.rb(gem和插件都不使用rails 3.1进行部署)

class WorkoutsController.rb

  def new
    @workout = Workout.new
    @date = params[:month] ? Date.parse(params[:month].gsub('-', '/')) : Date.today
    3.times do
      @workout.intervals.build
    end
  end

Workout.rb

  attr_accessible :workoutdate, :intervals_attributes
  has_many :intervals, :dependent => :destroy
  accepts_nested_attributes_for :intervals, :reject_if => lambda { |a| a[:interval_name].blank? }, :allow_destroy => true

Interval.rb

attr_accessible :interval_name, :workout_id
belongs_to :workout

视图/训练/ new.html.erb

<div id ="calendar">
  <%= calendar_for @workouts, :year => @date.year, :month => @date.month do |calendar| %>
    <%= calendar.head('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday') %>
    <% calendar.day(:day_method => :workoutdate) do |date, workouts| %>
      <%= date.day %>
      <%= render 'form' %>
    <% end %>
  <% end %>
</div>

视图/训练/ _form.html.erb

<%= nested_form_for @workout do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :workoutdate %><br />
    <%= f.date_select :workoutdate %>
  </p>
  <%= f.fields_for :intervals %>
  <p><%= f.link_to_add "Add interval", :intervals %></p>
  <p><%= f.submit "Submit" %></p>
<% end %>

视图/训练/ _interval_fields.html.erb

<p>
  <%= f.label :interval_name, "Interval" %>
  <%= f.text_field :interval_name %>
  <%= f.link_to_remove "remove" %>
</p>

目前正在使用heroku http://billeee.herokuapp.com/workouts

1 个答案:

答案 0 :(得分:1)

由于您在day方法的块中有可用日期,因此您应该可以将其传递给部分,如下所示:

<% calendar.day(:day_method => :workoutdate) do |date, workouts| %>
  <%= date.day %>
  <%= render 'form', :date => date %>
<% end %>

然后你可以在局部形式中使用它,并通过你刚刚传入的局部变量设置日期选择的日期:

<%= f.date_select :workoutdate, :default => date %>

作为一个注释:这个方法看起来有点滑稽,因为无论如何你总是在特定的一天渲染这个形式。为什么不发送日期,例如通过隐藏的输入字段?用户是否应该更改日期?如果是这样,那不会打破UI逻辑吗?