Как сделать статический контент в Rails? - PullRequest
72 голосов
/ 18 июля 2009

Глядя на разные варианты:

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

Я пробовал это, но я получил ошибку:

# in routes.rb:
map.connect '*path', :controller => 'content', :action => 'show'

# in content_controller.rb:
def show
  render :action => params[:path].join('/')
end

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

Ответы [ 7 ]

178 голосов
/ 11 февраля 2011

Для Rails5 и Rails4 вы можете сделать следующее:

Поместите строку ниже в конце вашего маршрута. Rb

  get ':action' => 'static#:action'

Затем запрашивает root / welcome , отобразит / app / views / static / welcome.html.erb .

Не забудьте создать «статический» контроллер, даже если вам не нужно ничего вставлять туда.

Для Rails3 вы должны использовать 'match' вместо 'get'

  match ':action' => 'static#:action'
30 голосов
/ 06 ноября 2009

thinkbot имеет плагин high_voltage для отображения статического контента: https://github.com/thoughtbot/high_voltage

22 голосов
/ 19 июля 2009

зависит от структуры URL, если вы хотите, чтобы пути выходили из / (например, / about_us), то:

map.connect ':action', :controller => "static"

Это должно идти в самом конце вашего файла маршрутов. Бросьте ваши файлы .html.erb в app / views / static и все готово.

Например: добавив about_us.html.erb, вы получите страницу по адресу /about_us.

Элемент, который у вас есть в вашем вопросе, отлично подходит для прохождения всех маршрутов, где вы можете проанализировать массив, предоставленный вам в params[:path]. Немного больше информации об этом на http://railscasts.com/episodes/46-catch-all-route

13 голосов
/ 18 июля 2009

Рендеринг действия не имеет смысла. Вы захотите визуализировать шаблон (или файл) с макетом.

# Path relative to app/views with controller's layout
render :template => params[:path]

# ... OR

# Absolute path. You need to be explicit about rendering with a layout
render :file => params[:path], :layout => true

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

# app/controllers/static_controller.rb
class StaticController < ApplicationController
  layout 'static'

  caches_page :show

  def show
    valid = %w(static1 static2 static3)
    if valid.include?(params[:path])
      render :template => File.join('static', params[:path])
    else
      render :file   => File.join(Rails.root, 'public', '404.html'), 
             :status => 404
    end
  end
end

Наконец, нам нужно определить маршрут.

# config/routes.rb
map.connect 'static/:path', :controller => 'static', :action => 'show'

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

  • http://localhost:3000/static/static1
  • http://localhost:3000/static/static3
  • http://localhost:3000/static/static2

Если вы загляните в app / public, вы увидите каталог static / с static1.html, static2.html и static3.html. После первого доступа к странице любые последующие запросы будут полностью статичными благодаря кэшированию страницы.

2 голосов
/ 04 ноября 2012

Линдсаар решение является одним из лучших, которые я когда-либо видел. Он создал кеширующие статические страницы, срок действия которых истек при изменении git revision.

<%= cache "site-page-#{@page_name}-#{App.git_revision}" do %>
  <%= render :partial => @page_name %>
<% end %>
2 голосов
/ 18 июля 2009

Учитывая, что у вас есть 1 домашний контроллер с парой методов, таких как show, aboutus, privacy:

class HomesController < ApplicationController
  def show
  end
  def privacy
  end
  def aboutus
  end
end

И сопоставьте метод show с вашим корнем, и сопоставьте другой с некоторыми именованными маршрутами, такими как

map.root      :controller => "homes", :action => "show"
map.aboutus "/aboutus", :controller => "homes", :action => "aboutus"
map.privacy "/privacy", :controller => "homes", :action => "privacy"

И с учетом каждого

app/views/homes/aboutus.html.erb --> you get http://localhost:3000/aboutus
app/views/homes/show.html.erb --> you get http://localhost:3000 (root)
app/views/homes/privacy.html.erb --> you get http://localhost:3000/privacy

Все используют один и тот же макет в app / views / layout / application.html.erb

1 голос
/ 27 апреля 2015

Создайте PagesController для ваших статических страниц (например, контакт) и вставьте

def contact_page
end

в config / rout.rb insert

get 'contact' => 'pages#contact_page'

, который будет отображать контент от views / pages / contact_page.html.erb

...