If there are routes such as * path
at the end of config / routes.rb
,
It matches before the endpoint (/ rails / active_storage / ...
) [^ 2] that indicates the ActiveStorage file.
[^ 2]: Click here for definition 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
To avoid this, do as follows.
config/routes.rb
Rails.application.routes.draw do
...
get '*path' , to: redirect('/'), constraints: lambda { |req|
req.path.exclude? 'rails/active_storage'
}
end
Now you can set the paths containing rails / active_storage
to not match.
constraints
optionInterpretation as an option to impose constraints on specific routes. Use as follows.
# 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' }
You can also specify lambda as described above. [^ 1]
get "hi", to: redirect("/foo"), constraints: ->(req) { true }
[^ 1]: Strictly speaking, you should specify an object that can be called by the call
method that takes request
as an argument. It seems that the target routing matches only when call
called for each request returns true. Although not mentioned in this post, matches?
Is also acceptable. (Test code, [Implementation part](https://github.com/ rails / rails / blob / e44b3419d44b5fa6e66305fe703f34bb63932593 / actionpack / lib / action_dispatch / routing / mapper.rb # L41-L42)