0

Github API から Rails アプリケーションのビューにプルしているリンクがいくつかあります。目標は、これらのリンクがネストされている場合は最終的にフォルダーごとにグループ化され、子がない場合は一意でスタンドアロンになるようにすることです。

Github リポジトリから返されるもののサンプルを次に示します。

app
app/assets
app/assets/images
app/assets/images/.keep
app/assets/javascripts
app/assets/javascripts/ace.js
app/assets/javascripts/application.js
app/assets/javascripts/editor.js.coffee
app/assets/stylesheets
app/assets/stylesheets/application.css
app/assets/stylesheets/editor.css.scss
app/controllers
app/controllers/application_controller.rb
app/controllers/concerns

これらのリンクのhttp://部分は常に同じであり、パスを絶対的なものにするために、今のところ連結しているだけです。

それらをフォルダーごとにグループ化するにはどうすればよいですか? 文字列メソッドを想像しますが、最適なメソッドが何であるかはわかりません。また、Ruby と JavaScript のどちらが最適なソリューションですか?

4

1 に答える 1

2

と呼ばれる配列にリストがあると仮定して、Ruby での簡単な方法を次に示しますpaths

grouped = paths.group_by { |p| File.dirname(p) }

これにより、以下を含むハッシュが生成されます。

{"."=>["app"],
 "app"=>["app/assets", "app/controllers"],
 "app/assets"=>
  ["app/assets/images", "app/assets/javascripts", "app/assets/stylesheets"],
 "app/assets/images"=>["app/assets/images/.keep"],
 "app/assets/javascripts"=>
  ["app/assets/javascripts/ace.js",
   "app/assets/javascripts/application.js",
   "app/assets/javascripts/editor.js.coffee"],
 "app/assets/stylesheets"=>
  ["app/assets/stylesheets/application.css",
   "app/assets/stylesheets/editor.css.scss"],
 "app/controllers"=>
  ["app/controllers/application_controller.rb", "app/controllers/concerns"]}

app/assetsディレクトリ要素 ( の下など) を取り除きapp、値の配列に (application.cssの代わりにapp/assets/stylesheets/application.css) 完全パスではなくベース名を含めたい場合は、次を使用できます。

grouped.each do |dir, paths|
  # If the path is also a hash key in "grouped", it must be a directory
  paths.delete_if { |path| grouped.has_key? path }
  # Replace each element with its basename
  paths.map! { |path| File.basename(path) }
end

最後に、空のディレクトリを省略するには:

grouped.delete_if { |dir, paths| paths.empty? }

これにより、次のものが得られます。

{"app/assets/images"=>[".keep"],
 "app/assets/javascripts"=>["ace.js", "application.js", "editor.js.coffee"],
 "app/assets/stylesheets"=>["application.css", "editor.css.scss"],
 "app/controllers"=>["application_controller.rb", "concerns"]}
于 2013-11-12T02:04:13.417 に答える