Статические страницы в Rails? - PullRequest
13 голосов
/ 22 октября 2010

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

Ответы [ 4 ]

12 голосов
/ 22 октября 2010

Это зависит от того, действительно ли они статичны.Вы всегда можете добавить страницы в каталог public/ вашего приложения, и они будут отлично работать.Они даже не запускают рельсы и не касаются механизма маршрутизации.

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

rails g controller site home about_us location

Затем вы можете поместить содержимое страницы, например, в app/views/site/home.html.erb.

ОБНОВЛЕНИЕ : Вы можете пойти еще дальше и кэшировать эти страницы с помощью вызова caches_page в верхней части вашего контроллера:

class SiteController < ApplicationController
  caches_page :home, :about_us, :location
end

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

6 голосов
/ 13 апреля 2017

Существует множество подходов, которые вы можете использовать (не все хорошие подходы).

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

Преимущество здесь в том, что вы не вводите overhead / bloat, создавая новый контроллер и папку. Недостаток в том, что это не 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? Я не думаю, что вероятность путаницы слишком высока, но все же хотел это отметить.

Также обратите внимание на сноску Хартла :

Наш метод создания статических страниц, вероятно, самый простой, но это не единственный способ. Оптимальный метод действительно зависит от ваших потребностей; Если вы ожидаете большое количество статических страниц, использование контроллера 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') %>.

4 голосов
/ 22 октября 2010

Я предпочитаю создать контроллер. Хороший учебник и объяснение на статических страницах: http://railstutorial.org/chapters/static-pages#top

1 голос
/ 22 октября 2010

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

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

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