【问题标题】:How and where should I implement this?我应该如何以及在哪里实施这个?
【发布时间】:2010-09-01 15:52:49
【问题描述】:

我有一个带有标题的服务模型:字符串描述:字符串日期:日期时间。我想实现一个系统来根据日期模式创建多个服务,例如当用户为 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] 中指定的数字)并保存它们中的每一个。

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

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

为了做到这一点,我必须更改模型中的某些内容(这应该称为虚拟属性),以便让控制器相信类似

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

实际上是有道理的,当调用@service.save 时会在我的数据库中创建 6 个不同的行。

这是我遇到困难并需要帮助的地方。我的推理有意义吗?以及如何实现?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我不会让 Service 实例上的 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] 是否是有效数字,并且用户没有同时指定两者。

    【讨论】:

      【解决方案2】:

      我听从了 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多