S'il y a une route telle que * path
à la fin de config / routes.rb
,
Il correspond avant le point de terminaison (/ rails / active_storage / ...
) [^ 2] qui indique le fichier ActiveStorage.
[^ 2]: Cliquez ici pour la définition https://github.com/rails/rails/blob/v5.2.4.4/activestorage/config/routes.rb#L4
config/routes.rb
Rails.application.routes.draw do
...
get "*path" , to: redirect('/')
end
Pour éviter cela, procédez comme suit.
config/routes.rb
Rails.application.routes.draw do
...
get '*path' , to: redirect('/'), constraints: lambda { |req|
req.path.exclude? 'rails/active_storage'
}
end
Cela vous permet de définir les chemins contenant rails / active_storage
pour qu'ils ne correspondent pas.
contraintes
Interprété comme une option pour imposer des contraintes sur des itinéraires spécifiques. Utilisez comme suit.
# match `/users/A12345`, but not `/users/893`
get 'users/:id', to: 'users#show', constraints: { id: /[A-Z]\d{5}/ }
# match port 3000 only
get :users, to: 'users#index', constraints: { port: '3000' }
Vous pouvez également spécifier lambda comme décrit ci-dessus. [^ 1]
get "hi", to: redirect("/foo"), constraints: ->(req) { true }
[^ 1]: À proprement parler, vous devez spécifier un objet qui peut être appelé par la méthode call
qui prend request
comme argument. Il semble que le routage cible ne correspond que lorsque call
appelé pour chaque requête retourne true. Bien que cela ne soit pas mentionné dans cet article, «correspond?» Est également acceptable. (Code de test, [Implementation](https://github.com/ rails / rails / blob / e44b3419d44b5fa6e66305fe703f34bb63932593 / actionpack / lib / action_dispatch / routing / mapper.rb # L41-L42)