web-dev-qa-db-ja.com

Rails:すべての不明なルートをroot_urlにリダイレクトします

ユーザーが間違ったページにアクセスするたびに、Railsはパブリックフォルダーの404.htmlを表示します。ただし、何も表示せずにブラウザーをルートページにリダイレクトしたいだけです。グロビングしましたが、役に立ちませんでしたが、それでも404ページが表示されています。

# ...
map.root :controller => 'home', :action => 'home'
map.connect '*', :controller => 'home', :action => 'home'

助言がありますか?みんなありがとう!

39

プロジェクトがRails 3を使用している場合は、この行をroutes.rbに追加するだけです

match '*path' => redirect('/')

編集:あなたがRails 4または5

match '*path' => redirect('/'), via: :get

または

get '*path' => redirect('/')
76
Arkan

アーカンの答えが好きです。 1つのポイントは、開発環境でこの動作を望まない場合は、行うことができます-

match '*path' => redirect('/')   unless Rails.env.development?
19
Sam Wilder

レール4-

routes.rb

単純なgetを使用して、すべての不明なルートをリダイレクトできます。

  get '*path', to: 'home#index'

POSTとGETリクエストの両方にルーティングを提供したい場合でも、matchを使用できますが、Railsはvia

  match "*path" => "home#index", via: [:get, :post]  

routes.rbは順次実行されます(指定されたパス構造に適合する最初のルートに一致します)。したがって、一致の下部にワイルドカードキャッチを配置します。

11
user

Rails 5.2で、all_storageルートがキャッチオールルートによってピックアップされるため、アップロードされた画像へのリンクが壊れているというバグがあります。この問題はRails githubのrepo、そしてバグが新しいリリースで修正されるまで、誰かが以下のパッチでコメントしました:

routes.rb最後の直前end

get '*all', to: 'application#index', constraints: lambda { |req|
    req.path.exclude? 'Rails/active_storage'
  }

次に、アプリケーションコントローラーに以下を追加します。

def index
  flash.notice = 'No page found at that address'
  redirect_to root_path
end
3
tomb

それを行うにはコントローラーを作成する必要があります

class RedirectsController 

  def index
    redirect_to root_url
  end
end

そしてあなたのルートで

map.connect '*', :controller => 'redirects', :action => 'index'
1
shingara