如何扩展url_for以提供动态默认参数

时间:2013-05-24 08:22:32

标签: ruby-on-rails routes custom-routes url-for

我正在尝试找出一种干净利落的方式来扩展url_for,以便它提供基于动态的默认参数。我知道这听起来很奇怪,让我解释一下:

我有一组位于动态范围下的嵌套资源路径:

scope "/:network", constraints: {:network => /[^\/]+/} do
  constraints DomainConstraint.new do
     resources :users do
       resources :posts
     end
  end
end

这给出了如下路线:

/mysite.com/users/mike
/someothersite.com/users/sally

为了在视图中生成这些路径,我可以很容易地做到:

mike = User.find_by_name("mike")
sally = User.find_by_name("sally")
user_path(mike.network, mike)
user_path(sally.network, sally)

但是,这对我来说似乎不太干,因为每个用户都修复了网络。我宁愿能够简明扼要地说:

user_path(mike)

2 个答案:

答案 0 :(得分:1)

所以,我提出了一个有效的解决方案,但它似乎非常hacky,我想知道是否有更“正确”的方法来做到这一点:

module UrlForWithDefault
  def self.included(base)
    base.module_eval do
      alias_method_chain :url_for, :default
    end
  end
  def url_for_with_default(*args)
    if args[0].kind_of?(Hash)
      opts = args[0]
      if opts.has_key?(:_positional_keys) and opts[:_positional_keys].include?(:network)
        opts[:_positional_args].unshift(opts[:_positional_args][0].network)
        url_for_without_default(opts)
      end
    end
    url_for_without_default(*args)
  end
end
ActionDispatch::Routing::UrlFor.send(:include, UrlForWithDefault)

我不喜欢这种方法,因为它破坏了“:_positional_keys”和“:_position_args”属性,这些属性可能会发生变化。

答案 1 :(得分:0)

无法url_options或Rails.application.routes.default_url_options做你想做的事情吗?