我正在尝试找出一种干净利落的方式来扩展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)
答案 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做你想做的事情吗?