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] 使用しているRubyRailsのバージョンを調べる
 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] フォームにドロップダウンリスト(タグ)を作成する
  <%= f.collection_select(:category_id, Category.all, :id, :name)%>
[120] ネストしたモデルのフォームを作成する
[121] フォームに1種類の入力項目を複数作成する
[122] バリデーションのエラーメッセージを表示する
  <%  @user.errors.full_messages.each do |msg| %>
    

  • <%= msg %>

  •   <% end %>
    [123] 数値を特定のフォーマットで表示する
      number_with_dalimiter
    [124] RubyスクリプトでHTMLタグを作成する
    [125] 規約に沿ったDOM要素のid属性やclass属性を付与する
      " class="<%= dom_class(blog) %>" >
    [126] 繰り返し項目を簡単に出力する
      ">
    [127] ヘルパーメソッドを作成する

    第5章 ActiveSupport

    [134] 単数形と複数形を変換する
      テーブル名とクラス名変換
      "cat".pluralize 単⇒複
      "books".singularize 複⇒単
    [135] クラス名とファイル名とテーブル名を相互変換する
      "User".underscore クラス⇒ファイル
      "user".camelcase ファイル⇒クラス
    [136] 日付や時刻を計算する
      t = Time.local(2011,6,2)
      t.yesterday
      t.tomorrow
      d = Date.new(2011,6,2)
      d.yesterday
      d.tomorrow
      30.minutes.ago
    # [137] 数値をバイト単位で表示する
    [138] RubyオブジェクトとYAMLを相互変換する
      Object#to_yaml オブジェクト⇒yaml
      YAML.load(yaml)  yaml⇒オブジェクト
    # [139] モデルオブジェクトや配列とXMLを相互変換する
    [140] RubyオブジェクトとJSONを相互変換する
      User.first.to_json
    [141] ArrayやEnumerableに追加された便利なメソッド
      ランダムに取り出す
        [:foo, :bar, :hoge].sample
      指定した値で分割
        [1,2,3,4].split(2)
    [142] 変数が特定のパラメータリストに含まれるか判定する
      (0..9).include?(val)
      val.in( (0..9) )
    [143] Hashに追加された便利なメソッド
      Hashの差を取得
        {:one => 1, :two => 2 }.diff.{:one => 3, :two => 2 }
      Hashから特定の値を取り除く
        .except
      Hashの内容をマージ
        .revers_merge
    [144] 小数を任意の桁数で丸める
      .round
      .round(2)
      .round(3)
    [145] Railsスタイルのメソッド引数を扱う
      ①引数の最後にHash形式でパラメータを指定できること
      ②パラメータのHashのキーでは文字列とシンボルを区別しないこと
      ③不正なパラメータを指定すると例外が発生する
    [146] 複数のメソッドに同じパラメータを渡す
      with_options
    [147] クラス変数のアクセサを定義する
      cattr_accessor
      インスタンスから呼び出すことができる
    [148] 既存のメソッドに機能を追加する
      class MyClass
        def greeet
      'hi'
    end
      end
      
      class MyClass
        def greet_with_message
      greeet_without_message + ", how are you?"
    end
    alias_method_chain :greet, :message
      end
    [149] nilや空文字列などを透過的に扱う
      Rubyではnilとfalseのみが偽
      nil.brank?
    [150] 簡単にGzip圧縮する
      ActiveSupport::Gzip.decompress(compressed)
    [151] タイムゾーン付きの日付を使う
      Time.zone = "Asia/Tokyo"
      p Time.zone
    # [152] メソッドの呼び出し結果をメモ化する
    [153] 国際化(日本語化)する
      I18n.locale = :ja

    第7章 ActiveResource

    [160] ActiveResourceとは
      特別な規約に従って公開されているリソースを利用するクライアントを作るライブラリ
      RESTful APIで公開されてるリソースをRubyオブジェクトにマッピングできる
    [161] ActiveResourceを利用するための設定をする
     Class Entry 
       selef.site = "http://example.com"
      end
    [162] リソースを取得する
      Entry.find(42)
    [163] リソースを作成・更新する
      entry = Entry.new
    [164] リソースを削除する
      entry = Entry.destroty
    [165] 単純なCRUD以外のリクエストを送信する

    第8章 テスト

    [166] RSpecを組み込む
      自動化テスト
      インストール
        gem "rspec-rails", ">= 2.6.0", :group => [:development, :test]
      rake spec
    [167] RSpecの基本的な動作を知る
      ファイルの位置
        app/models/blog.rb
        ⇒ spec/models/blog_spec.rb
        app/controllers/blogs_controller.rb
        ⇒ spec/controllers/blogs_controller_spec.rb
      spec_helper
        spec/controllers/blogs_controller_spec.rb
         require 'spec_helper'
          describe BlogsController do
        def mock_blog(stubs={})
            end
    [168] RSpecで使えるマッチャ
      should、should_notに続く部分をMatcher
      beマッチャ
      演算子マッチャ
      Predicateマッチャ
      haveマッチャ
    [169] テストを実行する
      rake spec
      rake spec:models
      rake spec:controller
      rake spec:views
      rake spec:requests
    [170] モデルのテストを実行する
      spec/models/entry_spec.rb
     describe "保存済みのもの" do
        before do
      @entry = Entry.first
    end
    if { @entry.should_not be_new_record }
    if { @entry.should_not be_new_record }
      end
      テストデータ
      spec/fixtures/entries.yml
      entry_1:
        blog: blog_1
    text: '今日もいい日だ'
      blog_1:
        title: '私のブログ'
    [171] コントローラのテストを実行する
      require 'spec_helper'
      describe EntriesController do
        fixtures :entries
    [172] エンドツーエンドのテストを実行する
      rails g integration_test entries
    [173] モックやスタブを使う
      スタブ、メソッド呼び出しを単純に差し替える
      モック、メソッドが予期したとおりに呼び出されたかを検証
    [174] その他のテスティングライブラリを利用する
      test/unit
      フィクスチャリープレースメント
      テストダブル
      Cucumber

    第11章 ライブラリ

    [183] OmniAuthでユーザ認証の仕組みを作る
      インストール
       gem "omniauth"
      config/initializers/omniauth.rb
       コンシューマーキー設定
    [184] アップロードされたファイルを扱う
      gem "carrierwave"
      rails g uploader Photo
    [185] DBの検索結果を複数のページに分けて表示する
      gem "Kaminari"
      コントローラー
        @users = User.page(3)
        @users = User.page(params[:page])
      ページング数表示
        <% paginate @users %>
    # [186] 非同期で処理を実行する
    [187] I18nの訳語ファイルを自動生成する
      gem "L18n_generators", :group => :development
    [188] Rails用ライブラリを探す
      The Ruby Toolbox
      GitHub
      RailsCasts
      RubyGems.org
    # [189] 自分で作ったライブラリをRubyGemsとして公開する
    [190] Railsを直す
      Railsオープンソース