Лучший способ изменить / отформатировать данные базы данных в контроллере? - PullRequest
0 голосов
/ 10 февраля 2009

Допустим, что в контроллере я получаю массив объектов из базы данных следующим образом:

@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"' в любые URL-адреса в поле "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 ]

3 голосов
/ 10 февраля 2009

Я хочу согласиться с Арамом. Мои представления были завалены кодом форматирования, пока я не начал добавлять методы моделей, которые значительно их очистили. В моем последнем приложении это были «Имена и времена» (приложение для планирования сотрудников).

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)

чтобы вернуть мою часто используемую отформатированную строку в любое место приложения. У вас может быть целый список ваших любимых форматов, чтобы очистить ваши представления и сделать их более понятными.

2 голосов
/ 10 февраля 2009

Возможно, вы захотите добавить некоторые методы экземпляра в модель TwitterStatus. Например:

def formatted_date
  self.date.formatDate
end
0 голосов
/ 10 февраля 2009

Ответственность за форматирование действительно принадлежит представлению.

"Путь Rails" будет состоять в том, чтобы добавить вспомогательный метод для форматирования.

С каждым контроллером связан вспомогательный модуль, а также глобальный 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 -%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...