Rails MVC: должна ли форма collection_select знать, какие записи коллекции она должна отображать? - PullRequest
0 голосов
/ 29 июня 2011

Я немного застрял здесь с концептуальной проблемой. Предположим, что следующая [абстрактная] настройка для Post, Tag и User:

Post  belongs_to Tag
Tag   has_many   Posts
User  has_many   Tags,
      has_many   Posts

Пользователь может пометить сообщение только одним из связанных с ним тегов.

В новом виде формы публикации теперь у меня есть следующие варианты выбора тега:

  1. f.collection_select :tag_id, current_user.tags, ...

  2. f.collection_select :tag_id, @tags, и в новом действии контроллера:

    @tags = current_user.tags

Вопрос: Что такое концептуально правильный вариант?

С точки зрения MVC, я определенно склонен использовать второй вариант. Неправильно, что представление знает, что теги, которые оно должно отображать в collection_select, связаны с пользователем (даже более конкретно, с текущим пользователем!).

Тем не менее, в официальной документации API для collection_select и некоторых других учебных пособий в Интернете я вижу нечто подобное:

collection_select(:post, :author_id, Author.all, ...)

, что явно благоприятствует первому варианту. На про-сайте этого подхода мне не нужно переопределять @tags в действии create контроллера, если сбой действия сохранения сообщения завершен, и я хочу снова отобразить новое действие.

Спасибо за ваши предложения заранее.

1 Ответ

1 голос
/ 29 июня 2011

Нет ничего плохого в вашем первом варианте. Для начала это проще (на одну строку кода меньше). Установка дополнительной переменной экземпляра в вашем контроллере ничего вам не даст.

Хороший способ думать о контроллере состоит в том, что он должен делать такие вещи, как установка переменных, только если они основаны непосредственно на вводе, который получает только контроллер (например, параметры в URL, строке запроса или данных из POSTed). форма).

Представление в этом случае не решает, как определить текущего пользователя - это все еще исходит от вашего контроллера (хотя, вероятно, унаследовано от ApplicationController верхнего уровня или что-то вроде Devise?), Все, что он делает, это решает, что это теги текущего пользователя, которые должны выбираться в выпадающем списке.

Это помогает?

...