RoR: определение класса внутри вспомогательного файла представления - PullRequest
1 голос
/ 03 марта 2011

У меня есть файл помощника вида, app / helpers / analysis_helper.rb, методы верхнего уровня которого я использовал в различных файлах вида. Работает отлично. Затем я определил класс AnalysisSummary внутри analysis_helper.rb, чтобы упаковать некоторую функциональность, специфичную для представления.

Однако, когда я пытаюсь создать экземпляр AnalysisSummary в файле представления, я получаю сообщение об ошибке:

uninitialized constant ActionView::CompiledTemplates::AnalysisSummary

Возможно, Rails говорит мне, что я не должен определять класс внутри вспомогательного файла? Если да, то где бы вы предложили парковку AnalysisSummary? Это не контроллер, это не модель ...

Спасибо.

Ответы [ 4 ]

6 голосов
/ 30 ноября 2012

В Railscasts # 213 (Revised) (увы, только подписчики), Райан Бейтс предоставляет пример того, как (и почему) вы можете включить класс в помощника. Основная суть заключается в следующем:

# app/helpers/calendar_helper.rb
module CalendarHelper
  def calendar(date = Date.today)
    Calendar.new(self, date).render
  end

  class Calendar
    def render
      # Calendar, render thyself
    end
    # ... additional methods called by #render
  end
end

Для тех, кто против занятий в помощниках, что вы думаете о выборе Райана? Помощники для генерации разметки, верно? Так что, если вся логика внутри класса относится к рендерингу (довольно сложному) HTML, я думаю, что то, что он делает (в отличие от того, что он означает ), делает его подходящим для включения в помощник.

1 голос
/ 03 марта 2011

Почему это должен быть класс?Почему бы не просто набор методов?Вот что такое помощник: набор полезных методов.Бизнес-логика не принадлежит помощникам.Вы можете поместить свой код в модуль внутри вспомогательного файла, если вы хотите придать немного больше структуры и организации.

Вы можете поместить классы в app/models без необходимости быть классом ActiveRecord, но выследует серьезно подумать о том, какова цель вашего класса, прежде чем поместить его туда.

Если это касается только рендеринга представления и не доступа к данным напрямую, он принадлежит представлению или помощнику представления.

1 голос
/ 03 марта 2011

Вы можете вызвать класс, явно упомянув имя помощника

ApplicationHelper::AnalysisSummary.new

Но я не думаю, что это хорошая идея иметь классы в помощниках.

0 голосов
/ 03 марта 2011

Тогда это модуль :) Определенно не определяйте классы внутри помощников.Jsut использовать простой модуль, чтобы сделать работу.

...