Rails 3.0 - 在哪里放这个逻辑?

时间:2011-10-25 16:23:17

标签: ruby ruby-on-rails-3 rails-activerecord

我有一个带有成员due_date的模型任务。我正在使用Chronic从用户那里获取自然语言输入并将其转换为时间,然后将其保存到模型中。

我只是不确定最好的Rails,MVC是处理这些用例的方法:

  1. 每次显示Task.due_date时,都会向用户显示格式化的字符串(包含一些逻辑)
  2. 允许用户输入纯文本并自动解析它们可以编辑的任何地方Task.due_date
  3. 格式化时间的辅助方法是我的第一个想法,如下所示:

    <%= format_time task.due_date %>
    

    结合我的Task模型中访问器上的重载setter,如下所示:

    attr_accessor :due_date_string
    
    def due_date_string=(string)
      self.due_date = Chronic.parse(string)
    end
    

    除了在我的表单中进行编辑之外,我在任何地方都可以使用

    <div class="field">
      <%= f.label :due_date %>
      <%= f.text_field :due_date_string %>
    </div> 
    

    我不知道如何正确地使f.text_field元素'连线',以便保存到:due_date_string,但使用辅助方法显示字符串。

    我不一定需要特定的代码示例,只需要寻找专业Rails-ers将在这里使用的模式。

    谢谢!

2 个答案:

答案 0 :(得分:1)

根据MVC惯例,数据句柄是关于模型层责任的。 所以你正朝着正确的方向去做一个setter(due_date属性的包装器):

您需要检查attr_acessible是否可以从params

获取数据
def due_date_string=(string)
  self.due_date = Chronic.parse(string) || Date.today
end

显示解析日期的表示逻辑是帮助层责任

答案 1 :(得分:1)

为了使用:

f.text_field :due_date_string

您是否还需要新属性的getter?如,

def due_date_string
  format_time self.due_date
end

或许分享使用自定义文本字段时发生的错误或失败。 :)