首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails样式仅使用Journey进行路由字符串解析

Rails样式仅使用Journey进行路由字符串解析
EN

Stack Overflow用户
提问于 2013-02-22 01:03:28
回答 1查看 265关注 0票数 2

给定这个映射定义:/order/:meal/:cheese

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

我一直在尝试在rails之外实现这一点。还有其他一些问题说明了在Rails中使用recognize_path是如何实现的。我知道使用正则表达式或拆分可以很容易地实现这一点,但我希望免费提供额外的解析功能(如:format等)。

下面是一些有效的方法。只是想知道有没有人能改进一下。我基本上是压缩/组合旅程匹配的两个部分(名称和捕获),以生成匹配散列(类似于what recognize_path)。我只是想知道是否有人已经接触到了旅程,并试图做同样的事情。

代码语言:javascript
复制
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

这就是打印出来的东西。

代码语言:javascript
复制
{:meal=>"hamburger", :cheese=>"american"}
{:meal=>"hotdog", :cheese=>"cheddar"}

还有没有其他部分可以用来构建匹配散列?看,matches.namesmatches.captures实际上是数组对象,这感觉像是个黑客。当然,Rails的某些部分在某种程度上将这些放在了一起。

请注意,只使用了the gem (包含在Rails 3.2.0+中)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-22 02:58:34

Journey::Router does it here

代码语言:javascript
复制
    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 }]

所以看起来似乎没有一种方便的方法来做你想要做的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15008108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档