我应该如何以及在何处实现此目的?

时间:2010-09-01 15:52:50

标签: ruby-on-rails model-view-controller

我有一个带标题的服务模型:字符串描述:字符串日期:日期时间。我想实现一个基于日期模式创建多个服务的系统,例如:当用户在10月20日创建新服务时,他可以选择每月“重复”一次,持续5个月。由于10月20日,11月20日等原因,最终结果应该是创建了6项服务。 我实现这个的方式是工作,但真的很难看。在我看来,我有类似的东西:

<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 [:weeks_number]或params [:months_number]中指定的数字)并保存每个服务对象。< / p>

这听起来不太好,是吗?首先,我正在考虑将创建“多个”服务的所有逻辑转移到模型中。下一件大事是:如何清理视图和控制器?我希望我的控制器像

一样简单
@service = Service.new(params[:service])

为了做到这一点,我将不得不改变模型中的某些东西(这应该被称为虚拟属性),以便让控制器相信像

这样的东西
@service.repeat_method = "month"
@service.repeat = 6

实际上是有意义的,并且在调用@ service.save时会导致在我的数据库中创建6个不同的行。

这是我陷入困境并需要帮助的地方。我的推理是否有意义?以及如何实现这个?

谢谢。

2 个答案:

答案 0 :(得分:0)

我不会在服务实例上使用repeat_methodrepeat属性来执行您在问题中描述的魔法。我有一个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]是否为有效号码,并且用户未指定这两者。

答案 1 :(得分:0)

我遵循了Shadwell的建议。虽然没有全部移动到模型,但我最终得到了相当干净的视图和控制器:

查看:

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