web-dev-qa-db-ja.com

Railsで静的コンテンツを実行する方法は?

さまざまなオプションを見る:

1つは、静的ページをpublic /フォルダーに配置するだけですが、レイアウト/アプリケーションのヘッダーの一貫性が必要です。

これを試しましたが、エラーが発生しました:

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

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

必要なのは、.rhtmlを作成するだけで、よくある質問、連絡先、TOS、プライバシー、その他の非アプリケーションタイプのページなどを簡単にまとめる簡単な方法です。誰がこれをやったの?

72
Timothy T.

thoughtbotには、静的コンテンツを表示するためのhigh_voltageというプラグインがあります。 https://github.com/thoughtbot/high_voltage

30

Rails5およびRails4の場合、次のことができます。

Routes.rbの最後に以下の行を追加します

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

次に、root/welcomeへのリクエストは、/ app/views/static/welcome.html.erb

「静的な」コントローラを作成することを忘れないでください。そこに何かを置く必要はありません。

Railsの場合、「get」の代わりに「match」を使用する必要があります

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

/からパスを取得する場合は、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 でそれに関するもう少しの情報

22
Omar Qureshi

アクションのレンダリングは意味がありません。テンプレート(またはファイル)をレイアウトでレンダリングする必要があります。

# 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

ページキャッシングを使用して、1つのアクションからさまざまなテンプレートを提供できます。

# 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を見ると、static1.html、static2.html、static3.htmlのstatic /ディレクトリがあります。ページに初めてアクセスした後、ページキャッシングにより、以降のリクエストは完全に静的になります。

13
Tate Johnson

Uにshow、aboutus、privacyなどのカップルメソッドを備えたHome Controllerが1つあるかどうかを検討します。

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で同じレイアウトを使用

2
gkrdvl

Lindsaar 解決策は私が見た中で最高のものの一つです。彼は、gitリビジョンが変更されたときに期限切れになるキャッシング静的ページを作成します。

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

静的ページ(例:連絡先)のPagesControllerを作成し、挿入します

def contact_page
end

config/routes.rbに挿入

get 'contact' => 'pages#contact_page'

views/pages/contact_page.html.erbのコンテンツを表示します

1
GoodViber