Итак, мне интересно, что лучший способ делать статические страницы в Rails - это, вернее, Rails 3. Я всегда немного смущался по этому поводу, например, я должен создать контроллер или нет?
Статические страницы в Rails?
Ответ 1
Существует множество подходов, которые вы можете предпринять (они не все подходят).
1 - public
каталог
Если это действительно статично, вы можете поместить его в каталог public
. Вещи в каталоге public
будут обслуживаться немедленно, без прохождения стека Rails.
Преимущества:
- Поскольку ему не нужно терять время, проходя через стек Rails, клиент получит более быстрый ответ.
Недостатки:
- Вы не сможете использовать макет своих сайтов. Или просмотрите помощников, например
link_to
. - Вместо того, чтобы ваши взгляды находились в одном месте (
app/views
), теперь они находятся в двух местах (app/views
иpublic
). Это может сбить с толку.
Мысли: я чувствую себя очень сильно, что недостатки перевешивают преимущества здесь. Если вы хотите сделать небольшое улучшение скорости за счет удобочитаемости и счастья программиста, зачем использовать Rails в первую очередь?
2 - Поместите в app/views
и выполните рендеринг непосредственно с маршрутизатора
возможно, чтобы визуализировать представления с маршрутизатора. Однако это определенно не The Rails Way.
От официального RailsGuide при маршрутизации:
1 Цель Rails Router
Маршрутизатор Rails распознает URL-адреса и отправляет их в действие контроллера.
Архитектурно, нет ничего естественного в том, что карта маршрутизатора непосредственно отображается в представлении. Многие другие структуры делают именно это. Однако Rails этого не делает, и отклонение от установленного соглашения может смутить других разработчиков.
как я должен создать контроллер или нет?
Если вы не хотите использовать один из подходов, упомянутых выше, да, вы должны создать контроллер.
Затем возникает вопрос, как назвать контроллер. В этом ответе описываются некоторые варианты. Я перечислил их здесь с некоторыми мыслями. Я также добавлю еще три варианта.
3 - Используйте ApplicationController
# routes.rb
get "/about" to: "application#about"
# application_controller.rb
class ApplicationController < ActionController::Base
def about
render "/about"
end
end
# app/views/about.html.erb
Преимущество в том, что вы не вводите накладные расходы/раздувание, создавая новый контроллер и папку. Недостатком является то, что это не The Rails Way. Каждый созданный вами контроллер наследует от ApplicationController
. ApplicationController
обычно используется для размещения функций, которые вы хотите разделить между всеми другими контроллерами. См. Этот пример в Руководство по управлению рельсами действий.:
class ApplicationController < ActionController::Base
before_action :require_login
private
def require_login
unless logged_in?
flash[:error] = "You must be logged in to access this section"
redirect_to new_login_url # halts request cycle
end
end
end
4 - StaticController
или StaticPagesController
Майкл Хартл популярный учебник Ruby on Rails использует a StaticPagesController
. Я согласен с источником. Я получил это от того, что мне не нравится этот подход, потому что страницы часто не являются статическими.
Кроме того, существует вероятность путаницы - почему мы ставили другие статические представления в отдельные контроллеры? Должны ли статические представления отображаться из StaticPagesController
? Я не думаю, что вероятность путаницы слишком высока, но все же хотелось бы отметить это.
Также обратите внимание на Hartl footnote:
Наш метод создания статических страниц, вероятно, самый простой, но его не единственный способ. Оптимальный метод действительно зависит от ваших потребностей; если вы ожидаете большого количества статических страниц, использование контроллера Static Pages может стать довольно громоздким, но в нашем примере приложения достаточно всего лишь нескольких. Если вам нужно много статических страниц, взгляните на драгоценный камень high_voltage. ↑
5 - PagesController
Официальный Ruby on Rails руководство по маршрутизации использует PagesController
. Я думаю, что этот подход прекрасен, но он не является описательным вообще. Все это страница. Что отличает эти страницы от других страниц?
6 - UncategorizedPagesController
Я бы назвал контроллер UncategorizedPagesController
, потому что это именно то, что они есть - страницы без рубрики. Да, это немного более громоздко печатать и читать. Я предпочитаю преимущество ясности относительно лаконичности, но я мог понять, что выбор будет более кратким и идти с PagesController
, или что-то еще.
7 - Драгоценный камень с высоким напряжением
С High Voltage вам не нужно выполнять утомительную работу по написанию маршрутов и пустым действиям контроллера:
# routes.rb
root 'pages#home'
get '/about', to: 'pages#about'
get '/contact', to: 'pages#contact'
get '/help', to: 'pages#help'
get '/terms-of-service', to: 'pages#terms_of_service'
get '/landing-page', to: 'pages#landing_page'
...
# pages_controller.rb
def PagesController > ApplicationController
def home
end
def about
end
def contact
end
def help
end
def terms_of_service
end
def landing_page
end
...
end
Вы просто добавляете свои страницы в app/views/pages
и ссылаетесь на них: <%= link_to 'About', page_path('about') %>
.
Ответ 2
Это зависит от того, действительно ли они статичны. Вы всегда можете добавить страницы в каталог public/
вашего приложения, и они будут работать нормально. Они даже не запускают рельсы или не касаются двигателя маршрутизации.
Однако большинство страниц на сайте, включая статические, все равно должны использовать макет сайта. Вы не хотите обновлять макет на десятках страниц отдельно. В этом случае вы можете создать "контрольный" контроллер. Вот пример:
rails g controller site home about_us location
Затем вы можете разместить содержимое страницы в app/views/site/home.html.erb
, например.
UPDATE. Вы можете пойти дальше и кешировать эти страницы с вызовом caches_page
в верхней части вашего контроллера:
class SiteController < ApplicationController
caches_page :home, :about_us, :location
end
Просто имейте в виду, что если у вас есть динамические элементы страницы, такие как список ссылок, которые изменяются в зависимости от того, вошел ли пользователь в систему, кеширование страниц не будет работать для вас. Но эта информация должна указывать в правильном направлении.
Ответ 3
Я предпочитаю создавать контроллер. Хороший учебник и объяснение на статических страницах: http://railstutorial.org/chapters/static-pages#top
Ответ 4
Если они 100% статичны, просто запустите их на публике.
Например, когда вы создаете новый проект рельсов, в вашей общественности есть index.html
.
Если вам нужна более удобная маршрутизация, тогда да, создание контроллера, вероятно, не будет плохой идеей.