Статичні сторінки в Ruby on Rails


76

Які стандартні способи створення програми Ruby on Rails, яка матиме такі сторінки, як

  • Додому
  • Про
  • Зв'язок

Я б зазначив, що хтось має посилання або відповіді, а не просто каже, що використовує самоцвіт, тому що я хочу навчитися робити прості веб-додатки з такою поведінкою.

Відповіді:


113

Залежить від того, як ви хочете обробляти вміст на цих сторінках.

Підхід №1 - зберігати вміст у поданнях

Якщо ви просто хочете розмістити весь вміст у поданнях ERB, то дуже простий підхід полягає у створенні PagesController, метою якого є робота зі статичними сторінками. Кожна сторінка представлена ​​однією дією в контролері.

pages_controller.rb:

class PagesController < ApplicationController
  def home
  end

  def about
  end

  def contact
  end
end

routes.rb:

match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'

Потім створіть перегляди home.html.erb, about.html.erb та contact.html.erb у розділі app / views / pages. Ці подання містять будь-який вміст, який ви хочете на ваших статичних сторінках. Вони за замовчуванням використовуватимуть макет application.html.erb вашого додатка.

Ви також захочете вивчити кешування сторінок, щоб підвищити продуктивність.


Підхід №2 - зберігати вміст у базі даних

Ще одним підходом, який я використав, є створення базової системи управління вмістом для статичних сторінок. У цьому випадку в моделі представлені сторінки. Він використовує самоцвіт friendly_id для обробки кульок для кожної сторінки, щоб їх можна було отримати за гарним іменем у URL-адресі (наприклад, / about), а не за ідентифікатором.

page.rb:

class Page < ActiveRecord::Base
  attr_accessible :title, :content

  validates_presence_of :title, :content

  has_friendly_id :title, :use_slug => true, :approximate_ascii => true
end

pages_controller.rb:

class PagesController < ApplicationController
  def show
    @page = Page.find(params[:id])
    render 'shared/404', :status => 404 if @page.nil?
  end
end

show.html.erb:

<%= raw @page.content %>

routes.rb:

match '/:id' => 'pages#show'

Примітка: поставте цей запис в кінці route.rb, оскільки він відповідає усьому.

Тоді як ви хочете створювати, редагувати та оновлювати сторінки, вирішувати вам - ви можете мати інтерфейс адміністратора або якось вбудувати його у свій загальнодоступний інтерфейс. Цей підхід також може отримати користь від кешування сторінок.


8
Вам навіть не потрібно включати порожні методи в контролер. РЕДАГУВАТИ: Крім того, ви можете поставити це як своєрідний маршрут "спіймати все" після всього іншого: match ": action" => "сторінки", щоб уникнути необхідності оновлювати маршрути при додаванні нової сторінки. Однак ви можете бути обережними з цим, якщо у вас багато складних маршрутів.
Graham Edgecombe

Велике спасибі Джефе, це було на місці! Ідеєю, яку я мав на увазі, був 2. підхід, але я не знав, як зробити гарні URL-адреси такими. Ще раз спасибі!
LuckyLuke

Ви можете зробити щось на зразок domain.com/p/blog-post-slug для відповідності, а потім порівняти це з /p/:id. P - це "пост" і насправді може бути чим завгодно. Я думаю, що це краще, ніж збігатися з будь-яким маршрутом.
Ноа Кларк

Що це таке :approximate_ascii? Я не можу знайти документацію щодо цього. Однак я припускаю, що він використовує ASCII для наближення символу UTF-8, який зараз є типовим. github.com/FriendlyId/friendly_id/blob/master/lib/friendly_id/…
d_rail

1
@page = Page.find(params[:id])слід змінити на @page = Page.find_by_id(params[:id])або ви просто отримаєте за замовчуванням 404 (публічно) замість власного 404.
d_rail


13

Підхід Джеффа №1 (зберігання вмісту у поданнях та здійснення маршруту та дії контролера для кожної статичної сторінки) є хорошим. Єдине, що я б додав, це використовувати controllerмакрос у своїх маршрутах.

Отже, замість цього:

match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'

Ви можете зробити це:

controller :pages do
  get :home
  get :about
  get :contact
end

Це два додаткові рядки, але набагато вишуканіші, оскільки це виключає повторення та візуально об’єднує ваші статичні маршрути сторінок.

Він також використовує getметод http-дієслова замість match, що є кращою практикою для маршрутів Rails (і більш стислим, тепер, коли Rails 4 вимагає вказувати http-дієслово при використанніmatch .


6

Підхід Джеффа №1 чудово працює для мене. Ось трюк, щоб контролер динамічно шукав сторінки. При цьому вам не потрібно торкатися контролера, ані route.rb для додавання сторінок. Просто опустіть сторінки під додаток / перегляди / сторінки, і контролер знайде їх.

class PagesController < ApplicationController
  def show
    render params[:id]
  end
end

Це працює для мене, але лише тоді, коли я маю матч або потрапляю в маршрути. Чи є щось ще, що потрібно зробити, щоб не перераховувати всі маршрути в route.rb? за допомогою рейок 3.2.12
jrich

Завжди остерігайтеся того, що ви робите із введенням користувачем. Я не тестував цього, але маю renderдоступ до кожного окремого перегляду, тому я б хвилювався щодо такого, params[:id]що виглядає admin/whatever. FWIW, Rails автоматично рендеріть подання, не створюючи дії контролера, доки це представлення існує у папці подання, яка відповідає вашому контролеру. Все, що вам потрібно зробити, це додати відповідний маршрут, що не є великою проблемою.
Річард Джонс,

6

Перегляньте http://railstutorial.org Майкла Хартла, який постачається у версіях 2.3.8 та 3.0.x. Він охоплює це чудовими прикладами і веде вас до їх побудови дуже рано, і ви також матимете можливість дізнатися набагато більше, ніж цей приклад. Дуже рекомендую.


Зараз це доступно у версіях 3.2 та 4.0.
понеділок

2

config / routes.rb

get ':id', to: 'pages#show'

app / controllers / pages_controller.rb

class PagesController < ApplicationController
  def show
    begin
      render params[:id]
    rescue ActionView::MissingTemplate
      render :file => "#{Rails.root}/public/404", :layout => false, :status => :not_found
    end
  end
end

Потім помістіть свої статичні сторінки в app / views / pages / {name} .html.erb (або будь-який інший формат шаблону.)



0

Адекватна відповідь на ваше запитання в основному могла б виглядати як вступ до фреймворку Rails: щонайменше, структури MVC, шаблонів та маршрутизації DSL. Джефф дав хороший удар, але його відповідь все одно передбачає багато базових знань Rails з вашого боку.

Однак я б припустив, що якщо ваш веб-додаток справді такий простий, Rails може бути надмірним. Я б подивився на щось легше, як Sinatra , який має набагато нижчий рівень навчання, ніж Rails, і чудово справляється з подібними справами, не маючи справи зі складною маршрутизацією, магічним відображенням дій MVC / шаблону тощо.


0

Я пропоную додати ваші сторінки у загальнодоступну папку, щоб їх можна було обслуговувати безпосередньо, не маючи взагалі проходити через рейки. Хоча я не фахівець, тому не впевнений, чи може це мати якісь мінуси, якщо сторінка статична.


1
Однак це можна назвати грубим рішенням. Це не дозволить нам використовувати те, що пропонує Rails, особливо загальний дизайн макета та кешування сторінок . Хоча, я не хотів би повністю відкидати це рішення.
Сагар Ранглані

1
Цей прийом швидко полегшується, якщо у вас є щось на зразок Apache або Nginx, налаштованого на обслуговування сторінок у вашій publicпапці, але він відмовляється від будь-якого динамічного вмісту на ваших сторінках, наприклад панелі навігації, яка відображає статус входу / виходу користувача.
Річард Джонс,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.