Rails 3.0 - 该逻辑放在哪里?
我有一个模型任务,成员为 due_date。我正在使用 Chronic 获取用户的自然语言输入并将其转换为时间,然后保存到模型。
我只是不确定处理这些用例的最佳 Rails、MVC 方式:
- 每次显示 Task.due_date 时向用户显示格式化字符串(涉及一些逻辑)
- 允许用户输入纯文本并对其进行解析在他们可以编辑的任何地方自动编辑 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:
- Display a formatted string (with some logic involved) to the user every time I show Task.due_date
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
根据 MVC 约定,数据处理是关于模型层的责任。
因此,您将朝着正确的方向进行设置( due_date 属性的包装):
您需要检查是否可以访问 attr_accessible 来从 params 获取数据
显示解析日期的表示逻辑是 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
The representation logic to show the parsed date is Helper layer responsibility
为了使用:
难道你不需要新属性的 getter 吗?例如,
也许分享一下使用自定义文本字段时发生的错误或失败。 :)
In order to use:
Don't you also need a getter for the new attribute? e.g.,
Perhaps share what error or failure occurs when you use the custom text field. :)