多くのユーザーがhttp://(Rails app URL)/blog
にアクセスし続けていますが、実際にはブログを持っていません。ようやくPosterousブログをセットアップしましたが、ユーザーをそこに誘導したいと思います。これをroutes.rbを使用して構成する方法はありますか? httpd.confファイルの編集を含まないより良い方法はありますか?
使用しているRailsバージョンによって異なります。
レール
# in routes.rb
match "/blog" => redirect("http://example.com/blog"), :as => :blog
Rails 2
# in routes.rb
map.blog '/blog',
:controller => "a_helper_controller",
:action => "redirect_to_blog"
# in a_helper_controller.rb
def redirect_to_blog
redirect_to "http://example.com/blog"
end
これは古いので、他の誰かがこれを必要とする場合のためにRails 4:
get "/blog" => redirect("http://example.com/blog")
Rails 4の場合、Matchの代わりにgetを使用します。そうしないと、ランタイムエラーが発生します
Rails 5の場合:
get '/stories', to: redirect('/articles')
get '/stories', to: redirect('http://google.com')
フロントエンドルートを通常どおりエミュレートするRailsコントローラルート
背景:最初にRails monolith rendering html view。次にフロントエンドReactアプリがあり、バックエンドをJSON apiに変換する必要がありました。 Railsコントローラのように正確に動作するフロントエンドアプリを指すURLを(主に電子メールで)生成します。
RailsリソースをURLを構築する方法を模倣する方法を探していましたが、代わりにフロントエンドURLを指し、適切なpath_helpersを生成します。これは、アプリ、RSpec、cucumber /で簡単に使用できます。カピバラ、その他すべて。フロントエンドルートをエミュレートするためにルートをハックすることがわかりました。これには、フロントエンドVSバックエンドルートを完全に明確にするために追加のパラメーターを渡す必要もあります(カピバラテストで役立ちます)。
frontend_scope = {
as: :frontend,
Host: Rails.configuration.frontend_Host, # like https://www.example.com
port: Rails.configuration.frontend_port, # 443
constraints: (lambda { |request| request.params[:app] == :frontend })
}
scope(frontend_scope) do
root to: 'static_pages_controller#home'
resources :articles, only: [:show, :index]
end
次に、私のRubyコードで使用できます
frontend_article_url(@article, app: :frontend)
frontend_articles_url(app: :frontend)
... (and everything that can be generated in a classic Rails app)
不便なのは、リダイレクトにapp
パラメーターがあり、フロントエンドアプリと、Googleアナリティクスや検索エンジンなどの他のすべてのウェブアプリで無視する必要があるということです*。
*問題があります。両方の/articles
フロントエンドと/articles
バックエンドでは、追加のparamの助けがなければ、アプリは同じURLに解決される両方のルートで違いを生むことができません