我在Rails中使用简单的“breadcrumb”导航,我想将当前路径分成一系列字符串。是的我知道有这样的库,但是我对如何在纯Ruby中完成以下任务感兴趣。
假设你有一个像这样的url路径字符串:
/users/admins/1/edit
你想要返回一个像这样的字符串数组:
["/users","/users/admins","users/admins/1","users/admins/1/edit"]
你会怎么做?我已经尝试使用each_index
函数将每个后续部分添加到一起并将其推入一个新数组中,但我永远无法获得字符串的真正递归添加。
有什么想法吗?
答案 0 :(得分:6)
str = "/users/admins/1/edit"
str.split('/').drop(1).reduce([]){|res,s| res << res.last.to_s+'/'+s}
#=> ["/users", "/users/admins", "/users/admins/1", "/users/admins/1/edit"]
受pguardiario启发的第二个变种
str.scan(/\/\w*/).reduce([]){|res,s| res << res.last.to_s + s}
答案 1 :(得分:4)
不是真的递归,而是做你想要的:
a = '/users/admins/1/edit'.split('/')
a.each_index.map{|i| a[0..i].join('/')}[1..-1]
=> ["/users", "/users/admins", "/users/admins/1", "/users/admins/1/edit"]
答案 2 :(得分:2)
也许扫描比分裂更清洁:
paths = str.scan /\/\w*/
paths.length.times.map{|i| paths[0..i].join}
答案 3 :(得分:1)
def split_paths(str)
arr = []
str.scan('/') {arr << $` unless $`.empty?}
arr << str
arr
end
split_paths('/users/admins/1/edit') # => ["/users", "/users/admins", "/users/admins/1", "/users/admins/1/edit"]