2009-07-18 10 views
71

Guardando diverse opzioni:Come eseguire il contenuto statico in Rails?

Uno consiste nel mettere semplicemente le pagine statiche nella cartella pubblica /, ma voglio che l'intestazione da layout/applicazione sia coerente.

Ho provato questo, ma ho ottenuto un errore:

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

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

Tutto quello che voglio è un modo semplice per mettere insieme le cose come le mie pagine faq, contatti, TOS, privacy e altro tipo non applicazione da qualche parte facile semplicemente creando un .rhtml. chi ha fatto questo?

risposta

30

thoughtbot ha un plugin chiamato high_voltage per la visualizzazione di contenuti statici: https://github.com/thoughtbot/high_voltage

+4

collegamento interrotto: utilizzare: http://github.com/thoughtbot/high_voltage – Jonathan

+0

Appena aggiunto a un progetto, funziona benissimo! – Abel

13

Il rendering di un'azione non ha senso. Dovrai rendere un modello (o un file) con un 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 

È possibile servire una varietà di modelli diversi da una singola azione con il caching della pagina.

# 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 

Infine, sarà necessario definire un percorso.

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

Provare ad accedere a queste pagine statiche. Se il percorso non include un modello valido, eseguiremo il rendering del file 404 e restituiremo uno stato 404.

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

Se si dà un'occhiata in app/pubblico si noterà un/directory statica con static1.html, static2.html e static3.html . Dopo aver effettuato l'accesso alla pagina per la prima volta, eventuali richieste successive saranno completamente statiche grazie alla memorizzazione nella cache della pagina.

+0

Proprio quello di cui avevo bisogno, grazie! – bluediapente

2

Considerando se la u ha 1 Regolatore casa con il metodo coppia come spettacolo, aboutus, privacy:

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

e mappa il metodo show alla radice, e mappare l'altro per alcuni percorsi denominati come

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

E con vista per ogni

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 

tutto utilizzando lo stesso layout in app/views /layout/application.html.erb

22

dipende dalla struttura dell'URL, se si desidera che i percorsi escano da/(ad es./About_us), quindi:

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

Questo dovrebbe andare alla fine del file percorsi, Buttare i file .html.erb in app/views/statici e si è fatto.

ad esempio: lanciando in about_us.html.erb, verrà visualizzata una pagina in/about_us.

L'elemento che avete nella vostra domanda è ottimo per un percorso di cattura in cui è possibile analizzare la matrice data a voi a params[:path].Un po 'più informazioni su quello a http://railscasts.com/episodes/46-catch-all-route

178

Per Rails5 e Rails4 è possibile effettuare le seguenti operazioni:

mettere la linea di seguito alla fine del vostro routes.rb

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

richieste Poi a root/Welcom e, renderizza il /app/views/static/welcome.html.erb.

Non dimenticare di creare un controller "statico", anche se non devi inserire nulla.

Per Rails3 devi usare 'partita' invece di 'avere'

match ':action' => 'static#:action' 
+4

+1 Fantastico, proprio quello di cui avevo bisogno. Questo dovrebbe ottenere più voti come è per le ultime Rails. – spong

+14

Se qualcun altro si sta chiedendo, il ": azione" qui è magico; non funzionerà se lo chiami ": id" o ": title" o qualsiasi altra cosa. – mahemoff

+1

In Rails4, ricevo un avviso in modalità sviluppo dicendo di sostituire "match" con "get". – joseph

2

Lindsaar soluzione è uno dei migliori che io abbia mai visto. Ha creato pagine di cache statiche scadute quando la revisione git è cambiata.

<%= cache "site-page-#{@page_name}-#{App.git_revision}" do %> 
    <%= render :partial => @page_name %> 
<% end %> 
1

Creare un PagesController per le pagine statiche (ad esempio contatto) e inserire

def contact_page 
end 

in config/routes.rb inserire

get 'contact' => 'pages#contact_page' 

che visualizzerà il contenuto da vista/pagine /contact_page.html.erb

+0

Perché il downvote? Apprezzo che la mia risposta si riferisca a Rails 4, ma risponderò comunque a qualcuno. – GoodViber

Problemi correlati