Ruby on Rails

Ruby on Rails(以下Rails)の情報をまとめておきます。

「Ruby on Rails チュートリアル」http://railstutorial.jp/

http://railstutorial.jp/

私の場合、このチュートリアルに沿って学習しました。とても丁寧に書かれており、かなりのボリュームがあります。
私の場合、1カ月程かかりました。業務アプリケーションで必須となるユーザ管理や認証についても
実例を使って丁寧に書かれているので、
このチュートリアル+Web上の情報で一通りの業務アプリケーションを作成できると思います。ただし、バージョン管理に
「GitHub」https://github.com/
※第3版からは「Bitbucket」https://bitbucket.org/に変更されています。
アプリケーションサーバに
「heroku」https://www.heroku.com/home
という環境を一貫して使用しているので、他の環境を使用する場合は若干の応用が必要です。

チュートリアルで作成したデモアプリケーション
https://sec3.herokuapp.com/

正規表現
チュートリアルにも出てきますが、下記サイトは正規表現のクイックリファレンスも付いていて非常に重宝します。
「Ruby regular expression editor」http://www.rubular.com/

http://www.rubular.com/

どの言語でもそうですが、正規表現を使用する機会は出てきます。
しかし頻繁にという程でもないのでどうしても覚えにくく、こういうサイトはとても助かります。

Tips
チュートリアルに書かれていない、ちょっとした小技を紹介します。

  •  日本語化
    まず、日本語ロケールファイル(ja.yml)をダウンロードします。
    https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml
    このファイルを下記ディレクトリに配置します。
    [app_root]/config/locales/上記ファイルを使用するように設定します。
    [app_root]/config/application.rb

     config.i18n.default_locale = :ja

    以上でビューの表示が日本語になります。
    (name->名前、submit->送信、、、など)

  • アプリ固有のコンフィグ(設定ファイル)を作成
    Railsドキュメントhttp://railsdoc.com/では、
    [app_root]/config/application.rb
    にアプリケーション共通情報を設定する方法が書かれています。
    http://railsdoc.com/好みの問題かもしれませんが、私の場合は設定情報をrbファイルに記述する事に抵抗があるので、
    下記の方法でymlファイルに記述しました。
    [app_root]/config/my_config.yml

    
    COMMON: &COMMON
      author: "Shinji Kamei"
      ruby-gmail:
        user: "foo@gmail.com"
        pass: "bar"
    development:
      sub_title: "dev"
      <<: *COMMON
    production:
      sub_title: ""
      <<: *COMMON
    test:
      sub_title: "test"
      <<: *COMMON
    

    この設定ファイルは、初期化ファイルで起動時に明示的に読み込んでおく必要があります。
    /config/initializers/my_config.rb

    MY_APP = YAML.load(
      File.read("#{Rails.root}/config/my_config.yml"))[Rails.env]

    読み込んだ設定ファイルの内容はビューやコントローラから[MY_APP]オブジェクトを介して参照できます。

    MY_APP['ruby-gmail']['user'] # -> foo@gmail.com 
  • データベースにMySQLを使用
    RailsのデフォルトデータベースはSQLiteですが、MySQLを使う場合の例です。DB指定で新しいアプリケーションを作成します。

    $ rails new app_name -d mysql

    GemファイルはSQLiteになっているのでMySQL用のgemに変更します。
    /Gemfile

    ...
    # gem 'sqlite3', '1.3.8'
    gem 'mysql2'
    ...

     
    $ bundle install --without production
    $ bundle update
    $ bundle install
    
    

    /config/database.ymlをMySQL用に設定します。
    (設定値はMySQLの環境に合わせる)

    
    default: &default
      adapter: mysql2
      encoding: utf8
      pool: 5
      username: railsuser
      password: railspass
      host: localhost
    development:
      <<: *default
      database: mail_form_dev
    test:
      <<: *default
      database: mail_form_test
    production:
      <<: *default
      database: mail_form_pro
     
    

    以上でActiveRecordはMySQLを使用してくれます。
    アプリケーションコードでは特にデータベースの違いを意識しなくていいので楽ですね。

  • Gmailの受信
    デフォルトのActionMailerでGmailアカウントでのメール送信は出来ますが、
    受信はできません。
    受信用に私は
    「ruby-gmail」https://github.com/dcparker/ruby-gmail
    というgemを使用しました。/Gemfile

    
    ...
     gem 'ruby-gmail', '0.3.1'
    ...
     
    
    $ bundle install --without production
    $ bundle update
    $ bundle install
     

    使用例です。
    (詳細はhttps://github.com/dcparker/ruby-gmailを参照)

    gmail = Gmail.new(MY_APP['ruby-gmail']['user'],
                      MY_APP['ruby-gmail']['pass'])
    mails = gmail.inbox.emails(:unread).map do |mail| # 未読のみ取得
      if md = mail.subject.match(/inquiry_id=(\d+)/)  # 特定の件名のみ処理
        obj = MyObject.new
        obj.created_at = mail.date
        obj.updated_at = mail.date
        obj.inquiry_id = md[1] # 件名のマッチした文字列
        if !mail.text_part && !mail.html_part #本文処理
          obj.body = mail.body.decoded.encode("UTF-8", mail.charset)
        elsif mail.text_part
          obj.text = mail.text_part.decoded
        elsif mail.html_part
          obj.html = mail.html_part.decoded
        end
        mail.mark(:read) # 処理したメールを既読にすることもできます
       end
     end
     gmail.disconnect # 接続終了
     

  • ローディングスピナ(spinjs-rails
    重たい処理などで画面遷移に時間が掛かり、画面が固まっているのでは?という場面があると思います
    (アプリケーションの設計やチューニングの話は別の機会に、、、)
    そんな際に役に立つ、次画面の表示までローディング中を表す画像(スピン)を表示するライブラリです。
    (jquery依存)

    loadingspinner

    導入方法
    Gemファイルに下記を追加します。

    #Gemfile
    ...
    gem 'spinjs-rails'
    

    その後、bundle installを実行します。

    $ bundle install

    application.jsで読み込みの設定をします。

    
    // \app\assets\javascripts\application.js
    ...
    //= require spin
    //= require jquery.spin
    

    後は、使用したい画面のイベント(オブジェクト)にspin()関数を設定すれば動きます。

    
    $(document).ready(function(){
      $('#menu').click(function(){
        $(document.body).spin(); // menuがクリックされたらbodyでスピン起動
      })
    });
    

    基本的にはこれでいいのですが、ブラウザによっては「戻る」動作の際に、スピンが停止していない場合があります。
    今回の例ではbodyでスピンしているので、下記のようにonload、onunload時に明示的に停止させると止まるようになりました。

    
    // Onload,Unload時に停止
    window.onload = function(){
      $(document.body).spin(false); // 第一引数にfalseで停止
    }
    window.onunload = function(){
      $(document.body).spin(false);
    }
    

    、、、と思ったらスマートフォン(iOS8)で「戻る」動作をした時に止まらない現象が発覚しました。
    不本意ですが、「戻る」動作の時にリロードするようにしたら解決しました。

    
      // iOSの"戻る"対策
      window.onpageshow = function(event) {
        if (event.persisted) {
             window.location.reload();
         }
      };
    



    今回使用したライブラリには、オプションも用意されているので詳しくは本家サイトをご覧ください。


written by Shinji Kamei