Превратить календарь в форму с помощью Rails? - PullRequest
2 голосов
/ 10 ноября 2011

Вопрос : Как превратить календарь в форму, в которой выбор даты отображается в соответствии с календарным днем ​​вместо текущей даты?


Что яя пытаюсь сделать: Я хотел бы создать календарь, который отображает тренировки велосипедиста.

  • Создание тренировок в течение каждого календарного дня, автоматическое отображение даты тренировки, соответствующей данному дню, в форме

Каждая тренировка имеет много интервалов.Каждый календарный день имеет одну тренировку.

Плагины: Извлечены table_builder.rb и calendar_helper.rb из https://github.com/p8/table_builder (и гем, и плагин не развертываются с рельсами 3.1)

класс 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

views / workouts / 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>

views / workouts / _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 %>

views / workouts / _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 Ответ

1 голос
/ 14 ноября 2011

Поскольку у вас есть дата, доступная в блоке метода day, вы должны быть в состоянии передать ее частичному, например, так:

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

Затем вы можете использовать его в течениечастичная форма и установите дату выбора даты через локальную переменную, которую вы только что передали:

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

Как примечание: этот метод кажется немного забавным, так как вы отображаете эту форму всегда дляконкретный день в любом случае.Почему бы не отправить дату, например, через скрытое поле ввода?Пользователь должен изменить дату?И если так, разве это не нарушает логику пользовательского интерфейса?

...