0

URLを解析しようとしています。たとえば、私が引き抜こうとしている場所:

~/locations/1 => [locations,1]
~/locations/1/comments => [locations,1]
~/locations/1/comments/22 => [locations,1]
~/locations/1/buildings/3 => [buildings,3]
~/locations/1/buildings/3/comments => [buildings,3]
~/locations/1/buildings/3/comments/34 => [buildings,3]

フォーマットはかなり一貫しています。配列から始めましたが、まだ失敗しているようです:

@request_path = request.path.downcase.split('/')
@comment_index = @request_path.index("comments").to_i
if @comment_index > 0
  @request_path = @request_path.drop_while { |i| i.to_i >= @comment_index }
end
resource, id = @request_path.last(2)

誰かが手動で大文字の URL を入力した場合に備えて、小文字を追加しました。drop_while が機能していないようです。

4

1 に答える 1

1

コードを処理した後、どのような出力が得られますか?

編集済み

あなたの問題は、あなたが要素を変換to_iし、それが0. しかし、要素を比較したいのですindexが、通常はArray#indexメソッドindexを使用してその状況で要素を取得できます。

正しいアプローチ:

@request_path.drop_while { |i| @request_path.index(i) >= @comment_index }

pathなしで解析できdrop_whileます。

私の解決策:

def resource_details(path)
    resource_array = path.downcase.split("/").reject!(&:empty?)
    key = resource_array.index("comments")
    return key.present? ? (resource_array - resource_array[key..key + 1]).last(2) : resource_array.last(2)
 end

それはあなたの道のためにまたは切り取り["comments"]ます["comments","2"]

そのメソッドを呼び出します。

1.9.3p0 :051 > resource_details("/locations/1/buildings/3/comments")
 => ["buildings", "3"] 

1.9.3p0 :052 > resource_details("/locations/1/comments/2")
 => ["locations", "1"] 
于 2012-05-27T09:20:28.287 に答える