Статические страницы в Rails?

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

Ответы

Ответ 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

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

Ответ 4

Если они 100% статичны, просто запустите их на публике. Например, когда вы создаете новый проект рельсов, в вашей общественности есть index.html.

Если вам нужна более удобная маршрутизация, тогда да, создание контроллера, вероятно, не будет плохой идеей.