web-dev-qa-db-ja.com

Rails外部URLへのルートを作成する

多くのユーザーがhttp://(Rails app URL)/blogにアクセスし続けていますが、実際にはブログを持っていません。ようやくPosterousブログをセットアップしましたが、ユーザーをそこに誘導したいと思います。これをroutes.rbを使用して構成する方法はありますか? httpd.confファイルの編集を含まないより良い方法はありますか?

47
Chris

使用している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
61

これは古いので、他の誰かがこれを必要とする場合のためにRails 4:

get "/blog" => redirect("http://example.com/blog")

Rails 4の場合、Matchの代わりにgetを使用します。そうしないと、ランタイムエラーが発生します

64
nil

Rails 5の場合:

get '/stories', to: redirect('/articles')
get '/stories', to: redirect('http://google.com')

Railsガイドのソースページ

13
vitkoz

フロントエンドルートを通常どおりエミュレートする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に解決される両方のルートで違いを生むことができません

0