Rails 3.0 - 该逻辑放在哪里?

发布于 2024-12-11 14:01:35 字数 887 浏览 3 评论 0原文

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

我只是不确定处理这些用例的最佳 Rails、MVC 方式:

  1. 每次显示 Task.due_date 时向用户显示格式化字符串(涉及一些逻辑)
  2. 允许用户输入纯文本并对其进行解析在他们可以编辑的任何地方自动编辑 Task.due_date

格式化时间的辅助方法是我的第一个想法,如下所示:

<%= format_time task.due_date %>

与我的任务模型中的访问器上的重载设置器结合使用,如下所示:

attr_accessor :due_date_string

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

这适用于我想要它的任何地方除了< /em>在我的编辑表单中:

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

我不知道如何正确“连接” f.text_field 元素,以便将其保存到 :due_date_string,但使用辅助方法来显示字符串。

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

谢谢!

I've got a Model Task with a member due_date. I'm using Chronic to take natural language input from the user and convert it to a Time, which then gets saved to the model.

I'm just not sure the best Rails, MVC-ish way to handle these use cases:

  1. Display a formatted string (with some logic involved) to the user every time I show Task.due_date
  2. Allow the user to input plaintext and have it parsed automagically everywhere they can edit Task.due_date

A helper method to format time was my first idea, like this:

<%= format_time task.due_date %>

combined with an overloaded setter on an accessor in my Task model, like this:

attr_accessor :due_date_string

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

This works everywhere I want it to except in my forms for editing:

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

I don't know how to make the f.text_field element 'wire up' properly so that it saves to :due_date_string, but uses the helper method to display the string.

I don't necessarily need specific code examples, just looking for the kind of pattern that pro Rails-ers would use here.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

揽月 2024-12-18 14:01:35

根据 MVC 约定,数据处理是关于模型层的责任。
因此,您将朝着正确的方向进行设置( due_date 属性的包装):

您需要检查是否可以访问 attr_accessible 来从 params 获取数据

def due_date_string=(string)
  self.due_date = Chronic.parse(string) || Date.today
end

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

With according to MVC conventions, data handle is about Model layer responsibility.
So you are going in right direction to do a setter (wrapper for due_date attribute):

You need to check that is attr_acessible that is access to get a data from params

def due_date_string=(string)
  self.due_date = Chronic.parse(string) || Date.today
end

The representation logic to show the parsed date is Helper layer responsibility

顾冷 2024-12-18 14:01:35

为了使用:

f.text_field :due_date_string

难道你不需要新属性的 getter 吗?例如,

def due_date_string
  format_time self.due_date
end

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

In order to use:

f.text_field :due_date_string

Don't you also need a getter for the new attribute? e.g.,

def due_date_string
  format_time self.due_date
end

Perhaps share what error or failure occurs when you use the custom text field. :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文