Railsメモ
Ruby on Railsのメモ。対象バージョンは3以上
目次 |
データベースの設定
データベースの設定は app/config/database.yml で行う。
接続設定は名前をつけて複数の環境を設定できる。 デフォルトではdevelopmentの設定が使われる。
development: adapter: mysql database: recipe_test username: recipe password: ******* host: localhost encoding: utf8 socket: /var/lib/mysql/mysql.sock
アソシエーション
belogns_to
GroupとMemberというテーブル間で1:nの関連がある場合、MemberがGroupの一部である(MemberがGroupに属する)を表すため モデルMember(member.rb)に次のコードを追加する
belongs_to :group
このとき、モデルMemberにはgroup_idというフィールドが必要で、Groupのフィールドidとひもづけられる。
また、モデルGroupでのフィールド名をuserとしたいときには次の様にする。
belongs_to :user, :class_name => 'Member'
この場合、Groupのuser_idフィールドがMemberのレコードと関連づく
カウンタキャッシュ
カウンタキャッシュの使い方は次の通り
- 参照先のモデル(has_many側のモデル)にカウンタキャッシュ用カラムを追加
- belongs_toに:counter_cache=> true を設定する
カウンターキャッシュ用カラムの命名ルールは 「参照元テーブル名_count」だが、:counter_cache でtrueの代わりにカラム名を設定することで任意に命名できる。
モデルに対する操作にはカウンタキャッシュを更新するものと更新しないものがあるので注意。
特にモデルのデータロード状態やカウンタキャッシュにより動作の変わるsize、empty?メソッドの利用には注意。
| 更新される操作 | 更新されない操作 |
|---|---|
|
create save destroy |
delete |
参照元オブジェクトのカウント
モデル間の関連を定義すると、many側のモデルから関連するインスタンスのリストを取得できる。
そのリストの要素数を求めるにはsize、count、lengthという3つのメソッドがある。その違いは次の通り。
| size |
関連インスタンスがロード済み→その配列の件数 ロード済みでない場合ない→ カウンタキャッシュを使っている場合→カウンタキャッシュの値 カウンタキャッシュを使っていない場合→SQLのCOUNT文で求めた値 カウンタキャッシュが正しく維持されていなければ処理内容が変わるので注意 |
| count | 常にSQLのCOUNT文を発行して件数を求める |
| length |
関連インスタンスがDBからロード済み→その配列の件数 関連インスタンスがロード済みでない→DBからロードしてその配列の件数を返す 件数だけでなく関連インスタンスの走査を行う場合、これが最も効率的 |
Namespace
form_for でのnamespace指定方法
例えば、adminというネームスペースを作っているとすると次の様に指定する
<%=form_for([:admin,@target_model]) do |f|%>
また、scaffoldで作った雛形のコントローラーだと、フォームからの値の取得で
実行環境の指定方法
- rails server -e で指定する
:rails server -e production
- 注意
- Rails 3では、rails sコマンドでproduction環境のサーバを起動すると、public以下のファイルやディレクトリがサーバによって提供されなくなっている。config/environments/production.rbのconfig.serve_static_assetsをtrueにすることで解決する。 Passenger経由であれば、staticなファイルはApache等が提供してくれる部分なので問題なし。
レスポンスをjsonpで返す
基本的に render でjsonを返すのだが、コールバック関数の関数名をリクエストでもらう必要がある。
次の様にrenderメソッドの第2引数として指定する
format.json { render :json => {:success => true}, :callback => params[:callback]}
デフォルトでは renderメソッドで :json=>モデル を指定した場合に、そのモデルクラスの名称でルート要素ができる。 これをできないようにするには、config/enviroment.rbに次の記述する。
ActiveRecord::Base.include_root_in_json = false
config/initializersの下に適当なrubyスクリプトを作成し、上記を記述しても良い。
Tips
rubygemsをアップデートする
UbuntuなどrubygemsもOSのパッケージマネージャでインストールしている場合、gem update --systemが使えない場合がある。 でも、古いrubygemsだと新しいrailsがインストールできない場合もあり困ってしまう。 そんなときはこちらを参照==> Rubygemsの使い方メモ#Rubygemsをアップデートする
Rakefileの修正
Rails3でrakeの実行に失敗するとき次のようにRakefileを変更する
module ::MyApp ## <= アプリケーション名に合わせて変更
class Application
include Rake::DSL
end
end
module ::RakeFileUtils
extend Rake::FileUtilsExt
end
MyApp::Application.load_tasks
prototype.jsの代わりにJQueryを使う
Gemfileに次を追加する
gem 'jquery-rails', '>= 0.2.6'
bundleをインストールする
> bundle install
最後に次のコマンドを実行すると、prototype.jsがpublic/javascriptが削除されJQueryがインストールされる
> rails g jquery:install
JQuery-UIも使うときには --UI オプションをつける。
> rails g jquery:install --ui
参考:Rails3でjQueryを使う | 超ド素人のRuby on Rails挑戦日記
Jquery でAjaxを処理する
Railsのフォームやリンクで :remote=>trueにするとajaxでリクエストを送信するが、その処理を受けるにはjqueryのliveメソッドでajax:beforeSend、ajax:success、ajax:error、ajax:complete の4つのイベントを受け、それぞれの処理を実装することができる。 この場合、liveの引数に渡す関数には次の4つの引数が渡される。
- イベントオブジェクト
- ajaxのレスポンスデータ。
- ajaxのstatus
- 通信に利用したxhrオブジェクト
以下はサンプルコード
$(document).ready(function(){
$("#ajax-target")
.live("ajax:beforeSend", function(e,data,status,xhr){
//ajax通信の送信時の処理
})
.live("ajax:success", function(e,data,status,xhr){
//ajax通信の成功時の処理
})
.live("ajax:error", function(e,data,status,xhr){
// ajax通信失敗時の処理
})
.live("ajax:complete", function(e,xhr,status){
// ajax通信完了時の処理
});
});
バージョンを指定してアプリケーションを作る
rails newするときに次の様にバージョンを指定すれば良い。
次の例はRails 3.0.9指定で myappというアプリケーションをnewする場合。
> rails _3.0.9_ new myapp
アプリケーションを作ってしまえば、あとはバージョンのことは気にしなくても良い。