Como fazer conteúdo estático no Rails?
-
16-09-2019 - |
Pergunta
Olhando para diferentes opções:
Um deles é apenas para colocar as páginas estáticas na / pasta pública, mas eu quero o cabeçalho do layout / aplicativo para ser consistente.
Eu tentei isso, mas eu tenho um erro:
# in routes.rb:
map.connect '*path', :controller => 'content', :action => 'show'
# in content_controller.rb:
def show
render :action => params[:path].join('/')
end
Tudo que eu quero é uma maneira fácil de montar coisas como o meu FAQ, contato, tos, privacidade e outras páginas do tipo não-aplicação em algum lugar fácil por apenas criar um .rhtml. que tenha feito isso?
Solução
Thoughtbot tem um plugin chamado high_voltage para conteúdo estático exibindo: https://github.com/thoughtbot/high_voltage
Outras dicas
Para Rails5 e Rails4 você pode fazer o seguinte:
Coloque a linha abaixo no final do seu routes.rb
get ':action' => 'static#:action'
Em seguida, solicita a root / welcome , irá processar a /app/views/static/welcome.html.erb .
Não se esqueça de criar um 'estática' controlador, mesmo que você não tem que colocar qualquer coisa lá dentro.
Para Rails3 você tem que usar 'match' em vez de 'obter'
match ':action' => 'static#:action'
depende da estrutura url, se você quiser os caminhos para sair da / (por exemplo / about_us), então:
map.connect ':action', :controller => "static"
Isto deve ir no final do seu arquivo de rotas, Jogue seus arquivos .html.erb em app / views / estática e está feito.
por exemplo:. Atirar em about_us.html.erb
, lhe dará uma página em / about_us
O item que você tem na sua pergunta é ótimo para pegar todos rota onde você pode analisar a matriz dado a você no params[:path]
. Um pouco mais informações sobre o que em http://railscasts.com/episodes/46-catch- tudo-route
Renderização de uma ação não faz sentido. Você vai querer tornar um modelo (ou um arquivo) com um layout.
# 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
Você poderia servir uma variedade de diferentes modelos de uma única ação com cache de página.
# 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
Por último, vamos precisar definir uma rota.
# config/routes.rb
map.connect 'static/:path', :controller => 'static', :action => 'show'
Tente acessar essas páginas estáticas. Se o caminho não inclui um modelo válido, vamos processar o arquivo 404 e retornar um status 404.
-
http://localhost:3000/static/static1
-
http://localhost:3000/static/static3
-
http://localhost:3000/static/static2
Se você der uma olhada no app / público que você vai notar uma estática / diretório com static1.html, static2.html e static3.html. Depois de acessar a página pela primeira vez, todos os pedidos subseqüentes será graças inteiramente estáticas para cache de página.
Considerando se u tem 1 Início Controlador com método casal como show, aboutus, privacidade:
class HomesController < ApplicationController
def show
end
def privacy
end
def aboutus
end
end
E mapear o método show para a sua raiz, e mapear o outro para algumas rotas nomeadas como
map.root :controller => "homes", :action => "show"
map.aboutus "/aboutus", :controller => "homes", :action => "aboutus"
map.privacy "/privacy", :controller => "homes", :action => "privacy"
E com vista para cada
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
Tudo isso usando o mesmo layout em app / views / layout / application.html.erb
Lindsaar solução é um dos melhores que já vi. Ele construir uma páginas de cache estáticos que expiraram quando revisão git alterado.
<%= cache "site-page-#{@page_name}-#{App.git_revision}" do %>
<%= render :partial => @page_name %>
<% end %>
Criar um PagesController para suas páginas estáticas (contato por exemplo) e inserção
def contact_page
end
em config / routes.rb inserção
get 'contact' => 'pages#contact_page'
que exibirá o conteúdo de views / pages / contact_page.html.erb