在控制器中修改/格式化数据库数据的最佳方法?

时间:2009-02-09 22:02:33

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

假设在控制器中我以这种方式从数据库中获取一个对象数组:

@statuses = TwitterStatus.find(:all, :order => "tweet_id DESC", :include =>  :twitter_user)

此外,我在视图中有以下循环:

<% unless @statuses.nil? -%>
<ol>
    <% for status in @statuses %>
    <li><%= h(status.text -%>/li>
    <% end -%>
</ol>
<% end -%>

我的模型类中有更多数据(用户信息,status_id等),我想在视图中添加。

问题是这个日期的大部分时间都需要改变。我需要以某种方式格式化日期。我想将“target =”_ blank“'插入”text“字段中的任何网址。

我的第一个就是在控制器中有这样的东西:

for status in @statuses
  status.date = status.date.formatDate
  status.url = status.date.insertTarget
  status.user = status.user.doUserstuff

  #Adding new attribute
  status.username = status.user.lookupUserName

end

这对我来说感觉有点蹩脚。但是,我想不出更好的事情。

3 个答案:

答案 0 :(得分:3)

我想同意阿拉姆。我的视图中充斥着格式化代码,直到我开始添加大大清理它们的模型方法。在我的上一个应用程序中,它是Names and Times(员工安排应用程序)。

class Employee

 def full_name
  self.first_name + " " + self.last_name
 end

end

时间永远是一种痛苦,我的观点中到处都是时间(对应用程序至关重要)。所以我想在任何地方显示开始时间,而不是调用我存储在数据库中的属性,我调用了一个自定义方法

class Schedule

 def formatted_start_time
  self.start_time.strftime('%I:%M%p')
 end

end

另外作为最后一点,如果您在视图中的所有位置继续以相同的方式格式化时间,则可以扩展Time类并使您的调用更加简洁。在我的初始化文件夹文件夹中,我添加了一个''conversions.rb'文件,其中我添加了这一小行

Time::DATE_FORMATS.update(:shift => '%I:%M%p')

现在我所做的就是打电话:

time_object.to_s(:shift)

在应用程序的任何位置返回我经常使用的格式化字符串。您可以拥有自己喜欢的格式的完整列表,以清理您的视图并使其更易于理解。

答案 1 :(得分:2)

您可能希望向TwitterStatus模型添加一些实例方法。 例如:

def formatted_date
  self.date.formatDate
end

答案 2 :(得分:0)

格式的责任真的属于视图。

“Rails Way”将添加一个辅助方法来进行格式化。

每个控制器都有一个辅助模块,还有一个全局ApplicationHelper。

例如,如果您的控制器是StatusController

module StatusHelper

  def status_text( status )
    # do all your formatting and HTML escaping here
    ...
  end

end

并在视图中

<% unless @statuses.nil? -%>
  <ol>
    <% for status in @statuses %>
      <li><%= status_text(status) -%></li>
    <% end -%>
  </ol>
<% end -%>