wake-up-neo.net

Wie mache ich statische Inhalte in Rails?

Verschiedene Optionen betrachten:

Eine besteht darin, die statischen Seiten einfach in den Ordner public/zu stellen, aber ich möchte, dass der Header von layout/application konsistent ist.

Ich habe es versucht, aber ich habe einen Fehler bekommen:

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

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

Alles, was ich möchte, ist eine einfache Möglichkeit, Dinge wie FAQ, Kontakt, Nutzungsbedingungen, Datenschutz und andere nicht anwendungsbezogene Seiten einfach zusammenzustellen, indem ich einfach eine .rhtml-Datei erstelle. wer hat das gemacht

72
Timothy T.

thoughtbot hat ein Plugin namens high_voltage zum Anzeigen statischer Inhalte: https://github.com/thoughtbot/high_voltage

30

Für Rails5 und Rails4 können Sie Folgendes tun:

Fügen Sie die Zeile unten am Ende Ihrer Route ein

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

Dann werden Anfragen an root/welcome die Datei /app/views/static/welcome.html.erb .

Vergessen Sie nicht, einen 'statischen' Controller zu erstellen, auch wenn Sie dort nichts einfügen müssen.

Für Rails musst du 'match' anstelle von 'get' verwenden

  match ':action' => 'static#:action'
178
Roland Studer

abhängig von der URL-Struktur, wenn Sie möchten, dass die Pfade von/(z. B./about_us) kommen, dann:

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

Dies sollte ganz am Ende Ihrer Routendatei stehen. Werfen Sie Ihre .html.erb-Dateien in app/views/static und Sie sind fertig.

z. B .: Einwerfen von about_us.html.erb, gibt Ihnen eine Seite bei/about_us.

Der Gegenstand, den Sie in Ihrer Frage haben, eignet sich hervorragend für eine Fangroute, auf der Sie das Array analysieren können, das Ihnen unter params[:path]. Ein bisschen mehr Informationen dazu unter http://railscasts.com/episodes/46-catch-all-route

22
Omar Qureshi

Das Rendern einer Aktion macht keinen Sinn. Sie möchten eine Vorlage (oder eine Datei) mit einem Layout rendern.

# 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

Sie können eine Vielzahl verschiedener Vorlagen aus einer einzigen Aktion mit Seiten-Caching bereitstellen.

# 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

Zuletzt müssen wir eine Route definieren.

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

Versuchen Sie, auf diese statischen Seiten zuzugreifen. Wenn der Pfad keine gültige Vorlage enthält, wird die 404-Datei gerendert und ein 404-Status zurückgegeben.

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

Wenn Sie einen Blick in app/public werfen, werden Sie ein static/-Verzeichnis mit static1.html, static2.html und static3.html bemerken. Nach dem ersten Zugriff auf die Seite sind alle nachfolgenden Anforderungen dank Seiten-Caching vollständig statisch.

13
Tate Johnson

Überlegen Sie, ob Sie 1 Home-Controller mit Paarmethode wie show, aboutus, privacy haben:

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

Und ordnen Sie die show-Methode Ihrem Root zu, und ordnen Sie die andere einigen benannten Routen zu, wie z

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

Und mit Blick für jeden

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

Alle verwenden dasselbe Layout unter app/views/layout/application.html.erb

2
gkrdvl

Lindsaar Die Lösung ist eine der besten, die ich je gesehen habe. Er hat eine statische Cacheseite erstellt, die abgelaufen ist, als die Revision des Git geändert wurde.

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

Erstellen Sie einen PagesController für Ihre statischen Seiten (z. B. Kontakt) und fügen Sie sie ein

def contact_page
end

in config/routes.rb einfügen

get 'contact' => 'pages#contact_page'

daraufhin wird der Inhalt von views/pages/contact_page.html.erb angezeigt

1
GoodViber