module ActionDispatch::Routing::Mapper::CustomUrls
def resolve(*args, &block)
NOTE: The `resolve` method can't be used inside of a scope block such as
helper that gets called.
passed to `polymorphic_url` is a hash then it's treated as options to the URL
This generates the URL "/basket#items" because when the last item in an array
end
[:basket, options]
resolve "Basket", anchor: "items" do |basket, options|
to be two as the instance is passed as the first argument, e.g:
You can pass options to a polymorphic mapping - the arity for the block needs
standard polymorphic URL of "/admin/users/1".
The first `link_to` will generate "/profile" but the second will generate the
link_to "Profile", [:admin, @current_user]
link_to "Profile", @current_user
# app/views/application/_menu.html.erb
resolve("User") { [:profile] }
end
resources :users
namespace :admin do
resource :profile
# config/routes.rb
single model instance is passed and not more complicated forms, e.g:
NOTE: This custom behavior only applies to simple polymorphic URLs where a
`link_to`, `form_with` or `form_for` instead of the standard "/baskets/:id".
This will now generate "/basket" when a `Basket` instance is passed to
end
[:basket]
resolve "Basket" do
resource :basket
and `form_for` when passed a model instance, e.g:
of `polymorphic_url` and consequently the behavior of `link_to`, `form_with`
Define custom polymorphic mappings of models to URLs. This alters the behavior
def resolve(*args, &block) unless @scope.root? raise RuntimeError, "The resolve method can't be used inside a routes scope block" end options = args.extract_options! args = args.flatten(1) args.each do |klass| @set.add_polymorphic_mapping(klass, options, &block) end end