73

さまざまなオプションを検討します。

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、プライバシー、その他の非アプリケーションタイプのページなどを簡単にまとめることです。誰がこれをしましたか?

4

8 に答える 8

179

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

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

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

次にroot/welcomeへのリクエストは、 /app/views/static/welcome.html.erbをレンダリングします。

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

制限: 存在しないページにアクセスしようとすると、アプリケーション エラーがスローされます。404 を処理できる以下のソリューションを参照してください。

Rails3では、「get」の代わりに「match」を使用する必要があります

  match ':action' => 'static#:action'
于 2011-02-11T07:56:49.733 に答える
31

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

于 2009-11-06T16:46:39.390 に答える
22

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でそれに関するもう少し詳しい情報

于 2009-07-19T11:09:26.137 に答える
13

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

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

于 2009-07-18T04:26:17.173 に答える
3

与えられた回答から一般化されたコントローラーのアイデアを使用しましたが、404 をキャッチしたかったので、いずれかのケースを処理するアクションを入れました。

# app/controllers/static_controller.rb
class StaticController < ApplicationController
    def static_or_404
        render params[:static]
    rescue ActionView::MissingTemplate
        render :not_found
    end
end

そして、私のルーティングの一番下に:

# config/routes.rb
get '*static', to: 'static#static_or_404'

パスと同じ名前のビューを提供し、app/views/staticそのようなビューがない場合は を提供しますapp/views/static/not_found.html.erb。また、起こりたいと思っていたものと交換render :not_foundすることもできます。redirect_to root_path

于 2020-01-24T20:07:03.267 に答える
2

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

<%= cache "site-page-#{@page_name}-#{App.git_revision}" do %>
  <%= render :partial => @page_name %>
<% end %>
于 2012-11-04T09:40:18.810 に答える
2

show、aboutus、privacy のようなカップル メソッドを持つホーム コントローラーが 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 で同じレイアウトを使用

于 2009-07-18T10:28:45.147 に答える
1

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

def contact_page
end

config/routes.rb に挿入

get 'contact' => 'pages#contact_page'

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

于 2015-04-27T16:00:49.313 に答える