Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы по архитектуре RoR-приложения (MVC) 
:(
    Опции темы
rordeveloper
Дата 11.4.2012, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 11.4.2012

Репутация: нет
Всего: нет



Добрый день!

Помогите разобраться, как правильно использовать MVC в рельсах smile
Мой вопрос легче объяснить на примерах.

Модели: Event, Reply (события и отзывы).
На каждое событие может быть оставлено много отзывов.
В Event прописано, что он has_many отзывов, а у Reply - belongs_to событие.

EventsController:
Код

    # View event:
    def show
        @item = Event.find(params[:id])
    end


View events/show.html.erb:
Код

    ....
    <%= @item.title %>
    ....
    <% @item.replies.each do |reply| %>
        <%= reply.who %>
        <%= reply.message %>
    <% end %>


Это нормально, вызывать из view методы моделей?
А если надо отсортировать или отфильтровать эти отзывы (например, не показывать удаленные)?
не писать же <% @item.replies.where('deleted = 0').order('date').each do |reply| %>?

Или, может, правильней все же получить реплаи в контроллере?
Код

    # View event:
    def show
        @item = Event.find(params[:id])
        @replies = Event.replies.where('deleted = 0').order('date')
    end


А это тоже, наверное, неправильно, и сортировка и фильтрация должна быть спрятана в специально созданном для этого методе модели, а метод этот вызван из контроллера (см. ниже)?
Код

    def show
        @item = Event.find(params[:id])
        @replies = Event.fetch_replies(params[:id]) # <- это спец. метод модели, в котором отбираются и сортируются реплаи.
    end


И какой это должен быть метод? Метод класса, как я написал выше? Тогда ему надо передать экземпляр события (или его id).
Или может быть экземпляра класса, как ниже?
Код

    def show
        @item = Event.find(params[:id])
        @replies = @item.fetch_replies # <- это спец. метод модели, в котором отбираются и сортируются реплаи.
    end


Или может быть это должен быть метод модели Reply?
Код

    def show
        @item = Event.find(params[:id])
        @replies = Reply.find_by_event(@item) # with filtration and order by?
    end


Вобщем, полные непонятки.
Можно сделать миллионом способов, а как правильно?

Наверное здесь главный вопрос - что/где на эту тему почитать. Можно на английском.
Спасибо.

Это сообщение отредактировал(а) rordeveloper - 11.4.2012, 12:21
PM MAIL   Вверх
source777
Дата 11.4.2012, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



Цитата(rordeveloper @  11.4.2012,  09:27 Найти цитируемый пост)
Это нормально, вызывать из view методы моделей?

Атрибуты в принципе нормально, хотя в сложных случаях предпочтительнее вызывать методы не Model, а ViewModel, см. draper

Цитата

    def show
        @item = Event.find(params[:id])
        @replies = @item.fetch_replies # <- это спец. метод модели, в котором отбираются и сортируются реплаи.
    end

Это ближе всего к идеологически правильному варианту, хотя имя fetch_replies мне не нравится, оно не следует конвенции. Если критерии выбора отзывов универсальны в рамках приложения, то имеет смысл их все поместить в default_scope, в противном случае можно в default_scope отправить только where('deleted = 0'), а сортировку оставить в контроллере: 
Код

@event = Event.find(params[:id])
@replies = @event.replies.order(:name)

Это наиболее частый кейс, т.к. в реальных приложениях обычно несколько режимов сортировки.

Почитать рекомендую Rails AntiPatterns: Best Practice Ruby on Rails Refactoring и "Agile Principles, Patterns, and Practices" (есть переводы на русский двух версий этой книги: с примерами на C# и с примерами на Java)

Это сообщение отредактировал(а) source777 - 11.4.2012, 11:59


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
vlastelin8
Дата 12.4.2012, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.3.2012

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby on Rails"
source777
  • С чего начать? начинаем
  • Документацию смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby On Rails | Следующая тема »


 




[ Время генерации скрипта: 0.1150 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.