rails3レシピまとめ
第1章 Railsの基本
[001] Railsをインストールする
コマンド
gem install rails
rails -v
[002] Railsアプリケーションを作成する
rails new [applicationname]
[003] Railsアプリケーションのファイル構造を理解する
.gitgnore Gitで管理されないディレクトリとファイルを指定
aoo/asseets CoffeScriptやSCSS
[004] DB接続を設定する
/config/database.yml
各DBをインストールして設定
gem 'sqlite3'
gem 'mysql2'
gem 'pg'
[005] モデル・ビュー・コントローラを自動生成する
コマンド
raisl g scaffold [modelname] [calamname:model]
rake db:migrate
[006] Railsの規約とは
設定より規約
[007] Railsの宣言的記法とは
クラス定義の先頭付近に書く
メソッド定義の前に、クラスメソッド呼び出しとして書かれること
クラス全体の設定を行うために使う
[008] DBのマイグレーションファイルを生成する
DBのスキーマを変更するマイグレーション
rails g migration [migrationname]
ファイルの中身
class AddEmailAndDeletedToUsers < ActiveRecord::Migration
def change
add_column :users, :email, :string
add_column :users, :deleted, :boolean
end
end
モデルの作成
rails g model Pet name:string age:integer
[009] APIのドキュメントを参照する
Railsドキュメント
rake doc:rails
アプリケーションドキュメント
rake doc:app
プラグインドキュメント
rake doc:plugins
[010] 使用しているRubyやRailsのバージョンを調べる
rails -v
ライブラリのバージョン
rake about
[011] Railsをバージョンアップする
gem 'rails', '3.0.9'
bundle update
rake rails:update
[012] Railsやライブラリのバージョンを固定する
bundle installl
git add Gemfile Gefile.lock
最新版のRailsに固定
gem 'rails', :git => 'git://github.com/rails/rails'
[013] 開発サーバを動かす
rails s
[014] Railsを対話的に実行する
rails console
第2章 コントローラ
[015] コントローラとは
[016] テンプレートを指定して描画する
render :action =>"new", :layourt => "error_waning"
render :template => "users/show"(他のコントローラの場合)
[017] 文字列を直接描画する
render :text => "hello"
render :text => @user.pretty_inspect
[018] APIレスポンスを文字列として描画する
render :json => @entries
render :xml => @entries
[019] 描画結果を文字列として取得する
html_str = render_to_string :partial =>"summary_table"
[020] URLを生成する
url_for(:new_entry)
#=> "http://www.example.com/entries/new"
[021] コントローラ以外からURLを生成する
self.default_url_options = {:host => 'www.example.com'}
[022] 他のURLへリダイレクトさせる
redirect_to entries_url
redirect_to :back
[023] ステータスコードのみのレスポンスを返す
head(200)
head(:ok)
[024] ページのレイアウトを設定する
class EntriesController
layout "global_layout"
def show
layout "three_columns_layout", :only => [:index]
[025] コントローラ全体の共通のメソッドを追加する
class ApplicationController
private
def current_user
*****
end
[026] コントローラ名やアクション名を取得する
EntriesController.controller_name
EntriesController.controller_path
action_nem
[027] アクションの前または後にフィルタを適用する
before_filter
after_filter
[028] アクションの前後両方にフィルタを適用する
around_filter
[029] フィルタの実行をスキップする
skip_before_fileter
[030] リクエストの種類でレスポンスのフォーマットを変更する
respond_to :html, :json
respond_to :xml, :only => [:index]
[031] レスポンスフォーマットごとに処理を分岐する
[032] 簡単なメッセージを画面へ表示する
flash[:notice] = "ようこそ#{Date.today}"
リダイレクト時
redirect_to :root, :flash => {:error => "IDまたはPASS違う"}
[033] セッションにデータを保存する
session[:user_id] = @user.id
秘密情報を格納しない
巨大なオブジェクトは入れられない
[034] セッションの保存方法を変更する
DBに保存
rake db:sessions:create
rake db:migrate
[035] セッションを失効させる
reset_session
[036] フォームに入力された値を取得する
params
params[:id]
[037] リクエストヘッダの内容を取得する
request.method
request.referer
request.user_agent
[038] レスポンスヘッダの内容を設定する
response.headers
[039] 画像やファイルをダウンロードさせる
send_file "/var/data/path/to/archive.zip",
:filename => "archive.zip", type => "application/zip"
動的に生成したデータ
send_data
[040] クッキーを設定する
cokkies[:acceseed_on] = Time.now.to_s
[041] 本番環境でのエラーをまとめて処理する
public/404.html ルーティングエラー
public/422.html バリデーションエラー
public/500.html その他のエラー
[042] リソースへのルーティングを定義する
RESTful
Hoge::Application.routes.draw do
resources :entries
end
[043] リソースへのルーティングをカスタマイズする
Hoge::Application.routes.draw do
resources :blogs do
resources :entries
end
end
[044] 複雑なルーティングを定義する
トップページ指定
root :to => "portal#index"
[045] Rackアプリケーションやミドルウェアを作る
RailsはRackと呼ばれる枠組みの上で実行
Rackアプリケーション、入れ子になった他のアプリケーションを呼び出す
require 'rack'
class MyRackApp
def call(env)
end
end
Rackミドルウェア、複数を入れ子にすることができる
[046] RackミドルウェアをRailsに組み込む
[047] Rackアプリケーションをマウントする
[048] Basic認証をかける
authenticate_or_request_with_http_basic
[049] Digest認証をかける
authenticate_or_request_with_http_digest
[050] SSLを使う
.ssl?
第3章 モデル
[051] モデルとは、ActiveRecordとは
モデル データを格納するいれもの入れ物
ActiveRecord オブジェクトとして扱う
[052] DBスキーマを定義する
型
string text integer float decimal datetime
timestamp time date binary boolean references
:null :limit :default
例
t.string :title, :null => false, :limit => 100, :default => "not title"
マイグレーションファイル
create_table
drop_table
add_column
change_column
[053] マイグレーションでRailsにとって特別なカラムを追加する
[054] DBを検索してモデルオブジェクトをロードする
blog = Blog.find(1)
blog = Blog.find(1,2,3)
blog = Blog.last
blogs = Blog.all
[055] DBに初期データを投入する
db/seeds.rbを記述
rake db:seed
[056] リレーションを理解する
Book.scoped
[057] 検索条件を指定する
Blog.where(:name => "Riding Rails")
Blog.where("blog_id = ? AND created_at < ?",3,time)
Blog.where(:blog_id => 3).where(:published => true)
[058] 並び順を指定してDBを検索する
Entry.order("created_at")
[059] 取得件数を指定してDBを検索する
Entry.order("created_at").limit(30).offset(20)
[060] 関連テーブルとの結合を行う
Blog.joins(:entries)
[061] 関連モデルの情報をまとめてロードする
Entry.order("created_at").limit(30).includes(:author)
[062] 検索時に実行されるSQLの一部を変える
Blog.select("id")
[063] 検索条件をモデルにあらかじめ定義する
scope :adult, where("age >= 20")
引数ある場合
scope :titiled,labda {|t| where(:title =>t)}
[064] デフォルトスコープを定義する
default_scope wehre(:publised => true)
[065] リレーションにかかっているスコープを除外する
books.except(:order)
[066] 複数のモデルにまたがるリレーションを連結する
merge
[067] カラムを簡単に完全一致検索する
User.find_by_name("a_matsuda")
[068] モデルオブジェクトの内容をDBから再ロードする
blog.reload
[069] モデルオブジェクトを生成する
entry = Entry.ne
[070] モデルオブジェクトを保存してDBにレコードを追加する
save falseを返す
save! 例外を発生
[071] モデルオブジェクトを変更してDB内のレコードを更新する
entry = Entry.find(params[:id])
entry.content = "new content"
entry.save
[072] モデルオブジェクトを削除してDBからレコードを削除する
entry = Entry.first
entry.destroy
[073] 1対多の関連での参照元を設定する(belongs_to)
class Entry
blongs_to :blog
[074] 1対多の関連での参照先を設定する(has_many)
class Blog
has_many :entries
[075] 1対1の関連を設定する(has_one)
class User
has_one :blog
[076] 関連をまたいだ関連を設定する
[077] 多対多の関連を設定する
class Entry
has_many :categories, :through => categorizations
[078] ポリモーフィック関連を利用する
[079] 関連とDBへの保存のタイミングを整理する
[080] SQLを直接使って検索する
Entry.find_by_sql
[081] SQLの集計関数を利用する
count average maximum minimum
[082] トランザクションを使用する
ActiveRecord::Base.transaction do
user.save!
blog.save!
end
[083] rails consoleでモデルを操作する
[084] レコードの作成時刻・更新時刻を自動的に保存する
t.timsestamps
[085] ロックを利用する
楽観的ロック、テーブルに定義してロック
テーブルにlock_versionを追加
悲観的ロック、テーブルに定義しないでロック
lokeed_entry = Entry.find(1)
locked_entry.lock!
[086] DBに保存する値を検証する(バリデーションの概要を知る)
バリデーションの流れ
①モデルクラス単位で検証する条件を定義する
②モデルオブジェクトを生成し値を保存する前に①で定義した条件に従い検証する
③保存に成功したかどうかを判別し、保存されていない場合はエラーメッセージをユーザに提示
[087] バリデーションを定義する
class Entry
validates_presene_of :title, :content, :on => :create
[088] 対象の属性を軸にしてすっきりとバリデーションを定義する
class Book
validates :title, :presence = true
バリデーションの宣言
presence length numericality format inclusion
exclusion confirmation uniqueness acceptance
[089] バリデーションメソッドを自分で定義する
class Entry
validates_each
[090] カラムに対応しない属性を保存可能にする
[091] コールバックを利用する
create時に呼び出されるコールバック
save valid? before_validation validate
after_validation before_save before_create
create after_create after_save
[092] オブザーバを利用する
モデルに追加しないでコールバックが挿入できる
app/models/user_observer.rb
class UserObserver
def after_create(model)
Rails.logger.info("ユーザ:#{model.id}を登録しました")
end
[093] カウンタキャッシュを利用する
レコード数を求める処理の高速化
class Entry
belongs_to :blog, :counter_cache => true
[094] バリューオブジェクトを使う
[095] DBアクセスを効率化する
[096] 複数の属性を更新する場合に、特定の属性の更新を防ぐ
[097] id以外のカラムを主キーにする
set_primary_key
[098] テーブル名を変える
set_table_name
[099] DBクエリを直接発行する
class Entry
def
conection.execute("Select ***")
end
[100] モデルの値の変更を検知する
book.changed?
[101] DBに存在しないモデルオブジェクトを定義する
ActiveModel
第4章 ビュー
[102] ビューテンプレートとは
[103] ERBでRubyコードを実行してHTMLタグを出力する
<%=@raw %>
[104] HTMLタグを取り除く
strip_tags
stripe_links
[105] URL文字列をコントローラ名やアクション名から生成する
url_for(entry)
url_for(:controller =>"entries",:action=>"edit",:id=>3, :only_path =>false)
[106] タグを作成する
link_to("詳細を見る",@entry,{ :class => "detail"})
[107] タグを作成する
image_tag("logo.png")
[108] レイアウトを使ってテンプレートを分割する
app/views/layoutsディレクトリに作成
<%= yield :header %>
[109] ネストしたレイアウトファイルを使う
#top_menu {display: none}
layouts/application.html.erb
[110] スタイルシートやJavaScriptを読み込む
<%= stylesheet_link_tag "rails" %>
<%= stylesheet_link_tag "entries" %>
[111] 分割されたテンプレートを描画する
app/views/entries/_entry.html.erb
<%= render "entry" %>
[112] モデルに対応するフォームを作成する
@blog = Blog.new
form_for(@blog) do |f| end
[113] モデルに対応したフォーム内で入力項目を作成する
<% form_for(@entry) do |f| %>
<% f.label :title, "タイトル" %>
<% f.text_field :title %>
<% end %>
[114] 任意のフォームを作成する
<% form_tag("/serch") do%>
<% submit_tag("決定") %>
<% end %>
[115] ラベルを作成する
日本語用の名前
config/locales/ja.yml
[116] フォームに日付や時刻の入力項目を作成する
<% f.datetime_select("posted_on") %>
[117] フォームの二度押しを防ぐ
<% submi("決定", :disable_with => "Sending...") %>
[118] フォームにドロップダウンリスト(