2

このマッピング定義が与えられた場合: /order/:meal/:cheese

/order/hamburger/americanこの文字列を。に解析します{meal:'hamburger', cheese:'american'}

私は、これがレールの外で可能かどうかを理解しようとして、ジャーニーの内部で遊んでいました。Rails内でrecognize_pathを使用してそれがどのように可能であるかを示す他のSOの質問があります。また、正規表現や分割を使用してこれを簡単に実行できることはわかっていますが、追加の解析機能(:formatなど)が無料で必要です。

これが機能するものです。誰かが改善を持っているかどうかだけ疑問に思います。私は基本的に、Journeyの一致の2つの部分(名前とキャプチャ)を圧縮/結合して、一致ハッシュ(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"}

マッチハッシュを構築するために使用する可能性のあるJourneyの別の部分はありますか?ほら、matches.namesそしてmatches.captures実際には配列オブジェクトであり、これはハックのように感じます。確かに、Railsの一部はこれらをある時点でまとめています。

Journey gem(Rails 3.2.0+に含まれている)のみが使用されていることに注意してください。

4

1 に答える 1

2

Journey :: Routerはここでそれを行います

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

したがって、あなたがやろうとしていることを行うための便利な方法があるようには見えません。

于 2013-02-21T18:58:33.977 に答える