Railsのお勉強

というわけで、Railsも3になったんで、そろそろ勉強するかと、「Ruby on Rails 3 アプリケーションプログラミング」を買ってきて始めてみた。
いや、結構、これいいよ。みんな買うといい!
で、以下は、その本で書いてあることをやった時のメモね。

環境

これは自分の環境ね。本とはちょっと違うので、ご注意を

  • Ruby1.9.2:これ、結構重要。1.9.2からエンコードが強制に変わってるし。
    • むー、ruby1.9からは、ファイルのエンコーディングを「絶対に」指定しないとNGになるらしい。
      • なので、ファイルの頭に「# encoding: utf-8」の記述が必須。微妙!
  • Rails3.1.0:ここも、2からだいぶ変わったらしい。
  • 実行環境は、WindowsXP Pro SP3

以下、やってみた時のメモね!

自分でもいろいろやってみた!

Ruby on Rails 3 アプリケーションプログラミングの中には無いけど、いろいろやってみた時のメモも一緒に書いておこうかな

  • モデル系
    • scopeでallでの全件取得時にソートを指定するには、こんな感じで
        scope :all, order('project_no')
      
      • default_scopeでやっちゃうと、「必ず」指定されちゃうんだなー。デフォルトの解除ってできないのかな?
    • アソシエーションのbelongs_to時にクラス名を指定するには、こんな感じ
        belongs_to :owner_member, :class_name => "Member"
      
      • これだと、Memberクラスにowner_member_idで関連づけになる
      • なんで、上記をListクラスに書くと、View側でnameを取るにはこんな感じ
        <% @lists.each do |list| %>
           <%= list.owner_member.name %>
        <% end %>
        
  • devise
    • うーん、deviseの2になったら、confirmが動かなくなっちまったよー。
    • でも、app/views/devise/mailer/confirmation_instructions.html.erbのlink_toをこうすれば一応、動いた。
      <%= link_to 'regist', user_confirmation_url(:confirmation_token => @resource.confirmation_token) %>
      
      • 要するに、この場合はモデルuser用にurlが生成されてるっぽいのと、前にあった第一パラメータの@resourceが無くなったことかな?
    • ただ、変なのは、文字数が多い?と、メールのContent-Transfer-Encodingが変わっちゃって、URLがおかしくなるのはまいった…。
      • あー、そっか。URLとかがおかしくなるのは、HTMLだからなんだ!なんで、 ここ みたいに、ファイル名を*.text.erbにすれば…
      • →あれ、駄目だw。deviseの元のHTMLファイルが使われちゃうなー。もちょっと調査要!
  • 管理用にtypusを入れてみよう!
    • がーん、Rails4だとだめっぽい
    • まずは、Gemfileに以下の記述を追加
      gem 'typus'
      
    • で、インストール&生成
      bundle install
      rails generate typus
      
    • 後は、普通にWebサーバを起動すれば...。
    • おー、http://localhost:3000/admin にアクセスすれば、管理画面として使えるね!
      • 各テーブルが一覧で表示されて、クリックすれば全レコード表示になる、と。
      • で、各レコードの下に「Edit / Trash 」ってあるから、そこで変更&削除ができて、「Add New」で登録ね。
      • あー、ただ、IDの表示/入力はできないのかー。その辺は設定とかでなんとかなるのかな?
      • とはいえ、簡単にメンテするだけなら、これで十分だね!
    • あ、そのままだと管理画面が「認証なし」になっちゃうのかw
      • ということで、Typusによる管理画面の実装を元にmigrateすれば、いいみたい
        rails generate typus:migration
        rake db:migrate
        
      • これで、admin_usersってテーブルに管理用のユーザ情報を登録する形にできるんだね。簡単!
      • ただ、管理者一人もいないと自動で初期管理者を登録する画面に遷移するから、スグ登録しないとまずいよ!
    • モデルを作り直したら、typusでエラーが出るようになっちゃった。そりゃそうか。ということで、再構築するにはこんな感じ。
      • 以下のファイルを削除
        app/controllers/admin/*
        config/initializers/typus_*
        config/typus/*
        
      • で、再構築
        rails generate typus
        
      • rails destroy typusじゃだめだったんだよなー。なんでだろ?
  • Railsでネストしたモデルのformを使う: fields_for, accepts_nested_attributes_for
    • http://blog.livedoor.jp/satoyansoft/archives/65237464.html
    • 要するに、Memberに複数のAddressが紐づいているときに、すごい便利!
    • やり方は、こんな感じ
      • Memberモデルに、accepts_nested_attributes_for で定義
        accepts_nested_attributes_for :address, :allow_destroy => true
        
      • で、Viewにこんな感じで書くとOK
        <% form_for @member do |f| %>
          email: <%= f.text_field :email %> <br/>
          <% f.fields_for :address do |f2| %>
            都道府県: <%= f2.text_fieldf :prefecture %>
          <% end %>
        <% end %>
        
    • これ書くと、MemberのDestroy時に自動でAddressも削除されるし、すげーな!
    • ただ、これ使うとFunctional Testで「No route matches」だ出ちゃって、動かんなー。
  • モデルでリクエストの内容を参照したい!
    • なんかいつも忘れてしまうのでメモ
    • モデル側(例:list.rb)
       attr_accessor :request
      
    • コントローラ側(例:lists_controller.rb)
         @list.request = request
      
  • jQuery-UIのdatepicckerを使ってみよう!
  • RSpecで楽しいテストをやってみよう!
    • まずは設定など
      • Gemファイルにこれを追加
        group :test do
          gem "rspec"
          gem "rspec-rails"
        end
        
      • bundle installを実行
        $ rails g rspec:install
             create  .rspec
             create  spec
             create  spec/spec_helper.rb
        
      • で、テストファイルを作成
        $ rails g rspec:model list
           create  spec/models/list_spec.rb
        
      • ※コントローラーはこんな感じで(複数形に注意!)
        $ rails g rspec:controller lists
             create  spec/controllers/lists_controller_spec.rb
        
    • お次ぎはテストの書き方とか
      • この場合は、Listクラスのallメソッドの正常系で、allがnilじゃないことを確認してるね
        require 'spec_helper'
        
        describe List do
         describe 'all' do
           context 'normal case' do
             it 'not null' do
               List.all.should_not be_nil
             end
           end
         end
        end
        
    • この「should ==」ってば、「should eql()」とも書けるらしいけど、うーん、微妙。。。
    • fixturesもあるんだね。よかったー
      • まずは、fixturesファイルを以下に配置して
        $RAILS_APP/spec/fixtures/モデル名の複数形.yml
        
      • こんな感じで中身を書いておいて、
        list1:
          id: 1
          要素名: 内容
        list2:
          id: 2
          要素名: 内容
        
      • 後は、テスト時にこんな感じで呼び出すと、
        fixtures :フィクスチャファイルの名前のシンボル
          もしくは
        fixtures :all
        
      • テストの中でこんな感じで使えるよー。
        lists(:list1)
        

他の参考サイト


-
最終更新:2014年01月13日 09:01