Добро пожаловать / домашняя страница в Ruby on Rails - лучшая практика - PullRequest
79 голосов
/ 08 декабря 2008

Моя домашняя страница (или страница приветствия) будет состоять из данных двух моделей (назовем их авторами и сообщениями). Я новичок в рельсах и не уверен, что это лучший способ сделать это.

Должен ли я создать новый контроллер с именем welcome, который собирает данные об авторах и публикациях, а затем отображает их в представлении индекса приветствия? Или я должен иметь приветственное представление под моделью поста, которая также получает данные от авторов? Или любой другой способ сделать это?

Я понимаю, как сделать все это технически, но просто неуверен, каков наилучший метод использования инфраструктуры rails.

Ответы [ 7 ]

120 голосов
/ 12 июня 2012

Кажется, нет единой лучшей практики.

(1) Стандартный файл config/routes.rb предполагает, что корневая страница (или домашняя страница / страница приветствия) должна обрабатываться welcome#index. Если вы должны руководствоваться этим, то для генерации соответствующего welcome#index контроллера / действия вы можете использовать следующую команду:

rails generate controller Welcome index

Затем в config/routes.rb вы можете удалить маршрут GET (get "welcome/index"), автоматически добавляемый генератором, и поместить корневой маршрут root 'welcome#index' (или root :to => 'welcome#index' в Rails < 4) вверху файл, потому что он, вероятно, будет вашим самым популярным маршрутом и должен быть найден первым.

Также не забудьте удалить public/index.html в Rails < 4.

(2) Официальное руководство по маршрутизации Ruby on Rails использует PagesController. На самом деле он предлагает pages#main, хотя для меня более разумно использовать pages#home (потому что «домашняя страница» - это повсеместный термин / понятие). Кроме того, этот контроллер может обрабатывать другие ориентированные на страницы действия , такие как pages#about, pages#contact, pages#terms, pages#privacy и т. Д.

(3) Учебное пособие по Ruby on Rails , идет с static_pages#home и static_pages#help и т. Д., Хотя мне не нравится идея обозначения этого контроллера с помощью «статический». Эти страницы, вероятно, все еще будут иметь некоторые динамические аспекты, особенно домашнюю страницу!

(4) Хотя здесь не обсуждается, как обрабатывать домашнюю страницу , RailsCast # 117 на полустатических страницах предлагает еще один набор подходов к show -только ресурсы.

Я чувствую предпочтение 1 и / или 2. В сценарии «и» вы можете использовать welcome # index и pages # about и т. Д., Тогда как в сценарии «или» вы можете использовать pages # home, pages # о и т. д. Если меня заставят выбирать, я бы выбрал вариант 2 только потому, что у вас меньше кода. Кстати, 2 и 3 почти одинаковы, за исключением слова «статический».

51 голосов
/ 08 декабря 2008

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

Что я сделал для своего текущего проекта, так это сделал контроллер с именем Static, потому что мне нужно 3 статических страницы. Домашняя страница - одна из них, потому что там нет ничего, что можно увидеть или сделать, кроме как пойти куда-то еще.

Чтобы отобразить маршрут по умолчанию, используйте следующее в routes.rb:

# Place at the end of the routing!
map.root :controller => 'MyController', :action => :index

В моем случае это будет:

map.root :controller => 'static', :action => :index

Если вы хотите, вы можете создать контроллер только для этой домашней страницы. Я бы назвал это главным, или что-то, что вы можете вспомнить, что относится к домашней странице. Оттуда вы можете получить свои данные и свои модели и перейти к выходному виду.

class MainController < ApplicationController
  def index
    @posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user)
  end
end

Если у вас правильно определены отношения модели, шаблон для соответствия будет очень простым.

Удачи, надеюсь, это поможет.

28 голосов
/ 08 декабря 2008

Когда я впервые запустил Rails, я спросил себя как-то так. Вот что вам нужно знать:

  • Модели не обязательно имеют прямое отношение к контроллерам и представлениям.

То есть конкретная комбинация контроллер / представление может работать с таким количеством моделей, сколько вам нужно для генерации этой конкретной страницы.

Назначение контроллера - подготовить набор данных, который необходимо отобразить, независимо от того, какие модели используются для хранения этих данных.

Цель представления состоит в том, чтобы затем отобразить эти данные наиболее подходящим способом.

Другими словами, комбинации контроллер / представление никогда не находятся «под» определенной моделью. Они используют модели, но не подчиняются им в каких-либо иерархических отношениях. На самом деле они равноправны с любыми моделями, которые они используют.

Я думаю, что путаница возникла из-за примера генератора скаффолдов, найденного в AWDR и других вводных текстах, таких как:

скрипт ruby ​​/ генерировать контроллер модели скаффолда

Я знаю, что это подразумеваемое отношение между моделью и контроллером / представлениями немного смутило меня. Но на самом деле нет строгих отношений. Если бы они были, тогда было бы очень сложно сделать что-нибудь сложное с подходом MVC. И ясно, что это не так.

Надеюсь, это поможет.

- Джон

11 голосов
/ 08 декабря 2008

Лучшая практика будет вашим первым предложением. Создайте «приветственный» контроллер и вызывайте записи из любых моделей, которые вы хотите. Иметь корневую точку маршрута к этому контроллеру. Очень чистый и правильный.

9 голосов
/ 20 октября 2012

Этот ответ на Rails 3.2.1.

Сначала настройте контроллер для страниц, названных, например, static:

$ rails generate controller static

В файле app/controllers/static_controller.rb:

class StaticController < ApplicationController
    def index       
    end
end

Создать новый файл просмотра app/views/index.html.erb

И, наконец, настройте config/routes.rb:

MyApp::Application.routes.draw do
   match 'home', :to => "static#index"
   root :to => "static#index"
end

Это заставит и /home, и / перейти к тому, что вы поместите в только что созданный вами файл View.

9 голосов
/ 26 июня 2011

Обратите внимание, что в Rails3 правильный способ сделать это - добавить следующую строку в конец файла rout.rb:

root :to => "welcome#index"

и удалите public / index.html.erb.

Обратите также внимание, что welcome # index соответствует действию index в WelcomeController, и код из ответа The Wicked Flea будет выглядеть так:

class WelcomeController < ApplicationController
  def index
    @posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user)
  end
end
6 голосов
/ 08 декабря 2008

Создайте новый контроллер с соответствующим именем. SummaryController? StartController? DailyFrontPageController? У тебя будет идея.

Мало того, я бы серьезно подумал о создании новой модели, , а не на основе ActiveRecord, которая собирает информацию от ваших моделей Author и Post (или их настоящих имен) для представления в Посмотреть. Альтернативой является сбор данных в контроллере, который почти наверняка будет грязным - это было каждый раз, когда я пробовал это, и я много пробовал. Кажется, что отдельная модель выглядит намного аккуратнее.

Если обработка относительно проста, почему бы сначала не попытаться собрать данные в контроллере, а затем обернуть вывод в Struct, а затем заменить Struct реальным классом и переместить конструкцию туда, полностью рефакторинг. Это не должно слишком сильно увеличивать общее время (большую часть кода можно использовать повторно), и вы получите хорошее представление о том, что лучше для вас работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...