给定这个映射定义:/order/:meal/:cheese
将此字符串/order/hamburger/american解析为{meal:'hamburger', cheese:'american'}。
我一直在尝试在rails之外实现这一点。还有其他一些问题说明了在Rails中使用recognize_path是如何实现的。我知道使用正则表达式或拆分可以很容易地实现这一点,但我希望免费提供额外的解析功能(如:format等)。
下面是一些有效的方法。只是想知道有没有人能改进一下。我基本上是压缩/组合旅程匹配的两个部分(名称和捕获),以生成匹配散列(类似于what recognize_path)。我只是想知道是否有人已经接触到了旅程,并试图做同样的事情。
require 'journey'
def hashify_match matches
h = {}
matches.names.each_with_index do |key, i|
h[key.to_sym] = matches.captures[i]
end
h
end
pattern = Journey::Path::Pattern.new '/order/(:meal(/:cheese))'
matches = pattern.match '/order/hamburger/american'
puts hashify_match matches
matches = pattern.match '/order/hotdog/cheddar'
puts hashify_match matches这就是打印出来的东西。
{:meal=>"hamburger", :cheese=>"american"}
{:meal=>"hotdog", :cheese=>"cheddar"}还有没有其他部分可以用来构建匹配散列?看,matches.names和matches.captures实际上是数组对象,这感觉像是个黑客。当然,Rails的某些部分在某种程度上将这些放在了一起。
请注意,只使用了the gem (包含在Rails 3.2.0+中)。
发布于 2013-02-22 02:58:34
match_data = r.path.match(req.path_info)
match_names = match_data.names.map { |n| n.to_sym }
match_values = match_data.captures.map { |v| v && Utils.unescape_uri(v) }
info = Hash[match_names.zip(match_values).find_all { |_,y| y }]所以看起来似乎没有一种方便的方法来做你想要做的事情。
https://stackoverflow.com/questions/15008108
复制相似问题