How to override routes path helper in rails?

2019-03-30 19:23发布

问题:

My route is defined like this

match '/user/:id' => 'user#show', :as => :user

If for some reason a nil ID is passed I want the route helper to return only '#' and if ID is not nil i want it to return normal path like '/user/123'. or is there any better way to do it. this route helper has been used in lot of places in my code so I dont want to change that. Instead I am looking for one place which will effect all instances of user_path.

Thanks

回答1:

module CustomUrlHelper
  def user_path(user, options = {})
    if user.nil?
      "#"
    else
      super
    end
  end
end

# Works at Rails 4.2.6, for older versions try http://stackoverflow.com/a/31957323/474597
Rails.application.routes.named_routes.url_helpers_module.send(:include, CustomUrlHelper)


回答2:

I did this in app/helpers/url_helper.rb

module UrlHelper
  def resource_path(resource, parameters = {})
    # my implementation
    "/#{resource.category}/#{resource.name}#{ "?#{parameters.to_query}" if parameters.present? }"
  end
end

I know there are ways to define such a nested route but I have a codebase using that route in several parts, as the question states.

I tried to alias old method, but was not recognised:

alias_method :old_resource_path, :resource_path