Как создать статический контент в Rails?
-
16-09-2019 - |
Вопрос
Рассматриваю разные варианты:
Один из них — просто поместить статические страницы в папку public/, но я хочу, чтобы заголовок из макета/приложения был единообразным.
Я попробовал это, но получил ошибку:
# in routes.rb:
map.connect '*path', :controller => 'content', :action => 'show'
# in content_controller.rb:
def show
render :action => params[:path].join('/')
end
Все, что мне нужно, это простой способ объединить такие вещи, как мои часто задаваемые вопросы, контакты, списки сообщений, конфиденциальность и другие страницы, не относящиеся к приложениям, где-нибудь легко, просто создав .rhtml.кто это сделал?
Решение
у thinkbot есть плагин high_voltage для отображения статического контента: https://github.com/ Thoughtbot/high_voltage
Другие советы
Для Рельсы5 и Рельсы4 вы можете сделать следующее:
Поместите строку ниже в конец вашего маршрута.rb
get ':action' => 'static#:action'
Затем запросы на корень/добро пожаловать, отобразит /app/views/static/welcome.html.erb.
Не забудьте создать «статический» контроллер, даже если вам не нужно ничего туда помещать.
Для Рельсы3 вам нужно использовать «сопоставить» вместо «получить»
match ':action' => 'static#:action'
зависит от структуры 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
Рендеринг действия не имеет смысла.Вам понадобится визуализировать шаблон (или файл) с макетом.
# 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.После первого доступа к странице любые последующие запросы будут полностью статическими благодаря кэшированию страниц.
Учитывая, что у вас есть один домашний контроллер с парой методов, таких как шоу, о нас, конфиденциальность:
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.
Линдсаар решение - одно из лучших, которые я когда-либо видел.Он создает кеширующие статические страницы, срок действия которых истек при изменении версии git.
<%= cache "site-page-#{@page_name}-#{App.git_revision}" do %>
<%= render :partial => @page_name %>
<% end %>
Создайте PagesController для ваших статических страниц (например, контактов) и вставьте
def contact_page
end
в config/routes.rb вставьте
get 'contact' => 'pages#contact_page'
который будет отображать содержимое из представлений/страниц/contact_page.html.erb