2

鉴于此映射定义: /order/:meal/:cheese

将此字符串解析/order/hamburger/american{meal:'hamburger', cheese:'american'}.

我正在研究 Journey 的内部结构,试图弄清楚这是否可能在 Rails 之外。还有其他 SO 问题展示了如何在 Rails 中使用识别路径。而且我知道您可以使用正则表达式或拆分轻松完成此操作,但我想要免费的额外解析功能(如 :format 等)。

这是可行的。只是想知道是否有人有改进。我基本上是在压缩/组合旅程匹配的两个部分(名称和捕获)以制作匹配哈希(如识别路径)。只是想知道是否有人已经进入 Journey 并尝试做同样的事情。

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"}

我可以使用 Journey 的另一部分来构建匹配哈希吗?看,matches.names确实matches.captures是 Array 对象,这感觉就像是 hack。当然,Rails 的某些部分在某个时候将这些组合在一起。

请注意,仅使用 Journey gem(包含在 Rails 3.2.0+ 中)。

4

1 回答 1

2

Journey::Router does it here:

    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 }]

So it doesn't look as though there is a convenient way to do what you're trying to do.

于 2013-02-21T18:58:33.977 回答