- 更新日: 2015年1月8日
- Rails
RailsのERBビューからインスタンス変数の名前一覧を抽出するスクリプト
Rails の ERB ビューで使われているインスタンス変数(@hoge など)の名前一覧を取得したいケースがあったのですけど、そういうAPIはRails側では用意してなさそうだったので、ちょっとしたRubyスクリプトを書きました。
コントローラーからインスタンス変数を取得する場合は、以下の stackoverflow ページのように instance_variable_names で取得できます。
ruby – list Rails controller instance variables – Stack Overflow
コントローラーがまだ未完成で、ERBビューファイルをパースしてインスタンス変数の名前一覧を取得したい場合などの想定です。
ERBビューからインスタンス変数の名前一覧を抽出するRubyスクリプト
ERBビューからインスタンス変数、@hoge のように頭に @ の付く変数の名前一覧を抽出するRubyスクリプトです。
variable_extractor.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/usr/bin/env ruby # for erb ERB_OPEN = '<%' ERB_CLOSE = '%>' ERB_REGEXP = /#{ERB_OPEN}.+#{ERB_CLOSE}/ RUBY_VAR = /@[a-zA-Z0-9_]+/ content = ARGF.read erbs = content.scan(ERB_REGEXP) # extract variable in double quote "hoge#{@variable_in_double_quote}fuga" variables_in_dq = [] erbs.each do |e| var_strings = e.scan(/"[^"]*\#{#{RUBY_VAR}}[^"]*"/) var_strings.each do |str| vars = str.scan(/#{RUBY_VAR}/) variables_in_dq += vars end end # remove double quote strings erbs.map{ |e| e.gsub!(/"[^"]+"/, '') } # remove single quote strings erbs.map{ |e| e.gsub!(/'[^']+'/, '') } instance_variables = (variables_in_dq + erbs.map{ |e| e.scan(/#{RUBY_VAR}/) }.delete_if(&:empty?).flatten).uniq puts instance_variables |
※注意点として、シングルクォーテーション/ダブルクォーテーション内のエスケープ文字列を考慮していません。なので、”hello \”#{@hoge}\” !”, ‘hello \’@fuga\’ !’ のようなエスケープ文字列が含まれると、正確に抽出できません。
とりあえず書き捨てのコードで、正規表現を考えるのが面倒だったのでこのまま。自分の今回の用途では、ERBビューにエスケープ文字列を含む文字列がなかったこともありまして…。気が向いたら直します。
スクリプトの使い方
実行権を与えて、ビューファイルを引数で渡す。
1 2 3 4 |
$ chmod 755 ./variable_extractor.rb $ ./variable_extractor.rb /path/to/view_file.erb |
以上のように、インスタンス変数の名前一覧を抜き出したいERBビューファイルを引数で渡して使う。これで…
1 2 3 4 5 6 7 8 |
$ ./variable_extractor.rb /path/to/view_file.erb @hoge @fuga @foo @bar @baz |
と、/path/to/view_file.erb に含まれるインスタンス変数の名前一覧が出力されます。なんか、もっと簡単にできる方法がある気がするのですけど… とりあえず目的が達成されたのでいいか。
以下 stackoverflow に書いてあった方法でも同じこと実現できるかもですが、試してはいません。
Is there a way to list the available variables in an Ruby ERB template? – Stack Overflow
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!