Railsのbetter_errorsとRubyMineの連携でコードにジャンプ

    はじめに

    RubyMine, とてもいい。使わない人は、人生損してる。

    railsでエラーがでると、ブラウザが赤くなりエラー画面がでるのだけれども、 このエラーからRubyMineで表示しているコードの該当部分にジャンプできたら最高だと思っていたら、 better_errorsというgemで解決できそうなので、鼻血でた。

    better_errors

    better_errorsを導入すると、 railsのエラーをいい感じに表示してくれる。

    導入は、Gemfileに以下を記述。

    group :development do
      gem "better_errors"
      gem "binding_of_caller"
    end

    dockerとの連携

    そもそも、docker, rails5では、better_errorsが既知障害で動かなかった。

    config/initializers/development/better_errors.rb を新規作成して、以下を記述。

    if defined? BetterErrors
      # Private subnets defined by RFC1918 as stated in https://docs.docker.com/v1.5/articles/networking/
      BetterErrors::Middleware.allow_ip! '10.0.0.0/8'
      BetterErrors::Middleware.allow_ip! '172.16.0.0/12'
      BetterErrors::Middleware.allow_ip! '192.168.0.0/16'
    end

    RubyMine & Dockerとの連携

    config/initializers/development/better_errors.rb に、以下を記述。

    if defined? BetterErrors
      BetterErrors.editor = proc { |full_path, line|
        full_path = full_path.sub(Rails.root.to_s, '/home/tsu-nera/RubymineProjects/techacademy/weightodon')
        "rubymine://open?url=file://#{full_path}&line=#{line}"
      }
    end

    Docker環境をつかうには、一工夫必要だ。 Rails.rootは Docker環境でのパス、‘/home/tsu-nera/RubymineProjects/techacademy/weightodon’のところはローカル環境でのパス。 これを subコマンドで置換する必要がある。

    Ubuntu環境での設定

    Ubuntu環境では、Chromeから xdg-openが発行されても、それに対応するハンドラがないのでソースが開けない。

    以下を参考に、解決した。

    はじめに、RubyMineの Tools > Create command-line Launcherからコマンドラインで起動するためのコマンドを作成。ここでは、mineという名前。

    次に、desktop entry を作成。

    # /usr/share/applications/rubymine-urlhandler.desktop
    
    [Desktop Entry]
    Name=RubyMine
    GenericName=URI handler
    Exec=/usr/local/bin/rubymine-urihandler %U
    Icon=RubyMine
    Type=Application
    StartupNotify=true
    Categories=GNOME;GTK;Utility;TextEditor;Development;
    MimeType=x-scheme-handler/rubymine

    次に/usr/local/bin/rubymine-urlhandlerを作成

    #!/bin/bash
    # /usr/local/bin/rubymine-urlhandler
    
    # $1 is formatted like subl://open?url=file://%2Fpath%2Fto%2Ffile.txt&line=xx 
    url=$1
    
    # Strip off subl://open?url=file://
    file=${url#*file*//}
    
    # Strip off &line=...
    file=${file%&line=*}
    
    # Decode URL
    file=$(echo $file | sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b")
    
    # Strip off everything but what's after &line=
    line=${url#*line=}
    
    # Launch sublime
    mine "$file:$line"

    sudo update-desktop-database を叩く。

    これで、better_errorsのリンクからRubymineが開けるようになった。