Railsメモ このエントリーをはてなブックマークに追加

提供:Asterisk Works Wiki
移動: 案内, 検索

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のレコードと関連づく

カウンタキャッシュ

カウンタキャッシュの使い方は次の通り

  1. 参照先のモデル(has_many側のモデル)にカウンタキャッシュ用カラムを追加
  2. 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

アプリケーションを作ってしまえば、あとはバージョンのことは気にしなくても良い。

個人用ツール
名前空間
変種
操作
案内
主なカテゴリ
ツールボックス