Как и где мне это реализовать? - PullRequest
0 голосов
/ 01 сентября 2010

У меня есть модель сервиса с заголовком: строка описания: строка дата: дата и время. Я хотел бы реализовать систему для создания нескольких служб на основе шаблонов дат, например, когда пользователь создает новый сервис на 20 октября, он может выбрать «повторять» его один раз в месяц в течение 5 месяцев. Окончательный результат должен состоять в том, что будет создано 6 сервисов: 20 октября, 20 ноября и т. Д. То, как я это реализовал, работает, но действительно ужасно. У меня есть что-то вроде этого на мой взгляд:

<input type="radio" name="each" value="none" checked="true"/>No<br/>
<input type="radio" name="each" value="week"/>Each week for <input type="text" name="weeks_number" /> weeks.<br/>
<input type="radio" name="each" value="month"/>Each month for <input type="text" name="months_number" /> months.<br/>

В моем контроллере я вычисляю даты, когда будут выполняться различные службы, затем создаю N объектов службы (где N - это число, указанное в params [: days_number] или params [: months_number]) и сохраняю каждый из них.

Звучит не очень хорошо, правда? Прежде всего, я думал о том, чтобы перенести всю логику создания «нескольких» сервисов в модель. Следующая большая вещь: как очистить вид и контроллер? Я бы хотел, чтобы мой контроллер был таким простым, как

@service = Service.new(params[:service])

Чтобы сделать это, мне нужно что-то изменить в модели (это следует назвать виртуальные атрибуты ), чтобы контроллер мог поверить, что что-то вроде

@service.repeat_method = "month"
@service.repeat = 6

на самом деле имеет смысл и приведет к созданию 6 разных строк в моей БД при вызове @ service.save.

Вот где я застрял и нуждаюсь в помощи. Имеет ли смысл мои рассуждения? И как это реализовать?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2010

Я последовал предложению Шэдвелла.Не перемещая все в модель, я получил достаточно чистые виды и контроллер:

Вид:

<%= radio_button_tag :repeat_type, :none %> No<br/>
<%= radio_button_tag :repeat_type, :week %> Every week for <%= text_field_tag :repeat_weeks %> weeks.<br/>
<%= radio_button_tag :repeat_type, :fixed_month %> Every month for <%= text_field_tag :repeat_fixed_months %> months. (Eg. Oct 2, Nov 2, etc.)<br/>
<%= radio_button_tag :repeat_type, :fluid_month %> Each month for <%= text_field_tag :repeat_fluid_months %> months. (Eg. last Sunday of March, last sunday of April, etc.)

Контроллер:

def create
  @service = Service.new(params[:service])
  if @service.save
    frequency = params[:repeat_type]
    how_many = params[("repeat" + frequency + "s").to_sym]
    @service.create_repeats(how_many, frequency)
    redirect_to @service, :notice => "Servizio creato."
  else
    render :action => :new
  end
end

Модель:

def create_repeats(how_many, frequency)
  replica = self
  how_many.times do
    replica = replica.clone
    case frequency
      when "week" then
        replica.date += 1.week
      when "fixed_month" then
        replica.date += 1.month
      when "fluid_month" then
        replica.date = replica.date.next_similar_date
      else
        return
    end
    replica.save!
  end
end
0 голосов
/ 01 сентября 2010

У меня не было бы атрибутов repeat_method и repeat в экземпляре службы, выполняющих магию, описанную в вопросе. Я бы использовал метод create_repeats примерно так:

# Create repeats of this Service
# how_many:: the number of repeats to create
# repeat_method:: whether to repeat 'weekly' or 'monthly'
def create_repeats(how_many, repeat_frequency)
  # Set the first thing to be cloned as this instance
  rep = self

  # Create how_many copies increasing the date each time
  how_many.times do
    rep = rep.clone
    if repeat_frequency == 'weekly'
      rep.date += 1.week
    elsif repeat_frequency == 'monthly'
      rep.date += 1.month
    else
      raise "Unrecognized repeat frequency."
    end
    rep.save!
  end
end

Тогда ваш код контроллера будет выглядеть примерно так:

@service = Service.new(params[:service])
if @service.save
  if !params[:weeks_number].blank?
    repeats = params[:weeks_number].to_i
    repeat_frequency = 'weekly'
  elsif !params[:months_number].blank?
    repeats = params[:months_number].to_i
    repeat_frequency = 'monthly'
  end
  @service.create_repeats(repeats, repeat_frequency)
end

Я знаю, что это не откладывает всю логику модели, но некоторые параметры действительно нуждаются в особой логике, чтобы определить, как они переводятся из вида в слой модели.

Вы также можете проверить, что params[:weeks_number] или params[:months_number] являются действительными числами, и что пользователь не указал оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...