Ruby on Rails(以下Rails)の情報をまとめておきます。
私の場合、このチュートリアルに沿って学習しました。とても丁寧に書かれており、かなりのボリュームがあります。
私の場合、1カ月程かかりました。業務アプリケーションで必須となるユーザ管理や認証についても
実例を使って丁寧に書かれているので、
このチュートリアル+Web上の情報で一通りの業務アプリケーションを作成できると思います。ただし、バージョン管理に
※第3版からは「Bitbucket」https://bitbucket.org/に変更されています。
アプリケーションサーバに
「heroku」https://www.heroku.com/home
という環境を一貫して使用しているので、他の環境を使用する場合は若干の応用が必要です。
チュートリアルで作成したデモアプリケーション
https://sec3.herokuapp.com/
チュートリアルにも出てきますが、下記サイトは正規表現のクイックリファレンスも付いていて非常に重宝します。
「Ruby regular expression editor」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.rbconfig.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.ymlCOMMON: &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.rbMY_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依存)
導入方法
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