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

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

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

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

Ответ 1

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

То, что я сделал для моего текущего проекта, это создать контроллер с именем 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

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

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

Ответ 2

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

(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 и т.д., Хотя мне не нравится идея обозначать этот контроллер "static". Эти страницы, вероятно, все еще будут иметь некоторые динамические аспекты, особенно домашнюю страницу!

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

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

Ответ 3

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

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

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

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

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

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

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

ruby ​​ script/создать контроллер модели лесов.

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

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

- Джон

Ответ 4

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

Ответ 5

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

root :to => "welcome#index"

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

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

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

Ответ 6

Этот ответ относится к Rails 3.2.1.

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

$ rails generate controller static

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

class StaticController < ApplicationController
    def index       
    end
end

Создайте новый файл View 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.

Ответ 7

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

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

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