Home > Tags > Rails

Rails

rails.vimのファイル切り替えをRSpecに対応させる(仮)

rails.vimをインストールすると、RcontrollerとかRmodelコマンドでRSpecファイルからControllerやModelファイルに切り替えることができるんだけど、その逆ができないので対応させた。仮なのはVimスクリプトをちゃんと書けなくてコピペのごまかしだから。

書きかえるファイルは~/.vim/autoload/rails.vim。一応行数も書いたけどもしかしたらズレてるかもしれないので参考程度に。あと、バージョンは2.0使ってる。

まずは、:Rspec、:Rspeccontroller、:Rspecmodelを呼び出せるようにする。

1777   call s:addfilecmds("integrationtest")
1778   call s:addfilecmds("spec")
1779   call s:addfilecmds("speccontroller")
1780   call s:addfilecmds("specmodel")
1781   call s:addfilecmds("stylesheet")

なんでわざわざ3つあるのかと言うと、「:Rspec hoge」ってやった時にControllerのスペックなのか、Modelのスペックなのか判断する方法がわからなかったから。だからとりあえず「:Rspec」とやったときは、今開いているファイルに対応するスペックファイルを開き、個別に指定して開きたいときは「:Rspeccontroller hoge」もしくは「:Rspecmodel hoge」で明示的にControllerかModelかを指定するようにした。

次に「:Rspeccontroller [tab]」や「:Rspecmodel [tab]」としたときに、スペック名を補完できるようにfunctionを追加する。

1941 function! s:speccontrollerList(A,L,P)
1942   return s:autocamelize(s:relglob("spec/controllers/",s:recurse,"_controller_spec.rb"),a:A)
1943 endfunction
1944
1945 function! s:specmodelList(A,L,P)
1946   return s:autocamelize(s:relglob("spec/models/",s:recurse,"_spec.rb"),a:A)
1947 endfunction

最後に実際にファイルを開く部分。2331、2334、2340、2345の”spec”、”speccontroller”、”specmodel”が最初に設定したaddfilecmdsの引数と対応するっぽい。なのでfunction名はなんでもいいと思うけど、とりあえず他のに合わせた。

specEditは「:Rspec」に対応していて、開いたファイルがControllerかModelかで開くスペックファイルもかわる。speccontrollerEditとspecmodelEditはControllerかModelどちらか決まったものしか開かない。

2328 function! s:specEdit(bang,cmd,...)
2329   if s:model() != ''
2330     let f = s:model()
2331     return s:EditSimpleRb(a:bang,a:cmd,"spec",f,"spec/models/","_spec.rb")
2332   else
2333     let f = s:controller()
2334     return s:EditSimpleRb(a:bang,a:cmd,"spec",f,"spec/controllers/","_controller_spec.rb")
2335   endif
2336 endfunction
2337
2338 function! s:speccontrollerEdit(bang,cmd,...)
2339   let f = s:controller()
2340   return s:EditSimpleRb(a:bang,a:cmd,"speccontroller",f,"spec/controllers/","_controller_spec.rb")
2341 endfunction
2342
2343 function! s:specmodelEdit(bang,cmd,...)
2344   let f = s:model()
2345   return s:EditSimpleRb(a:bang,a:cmd,"specmodel",f,"spec/models/","_spec.rb")
2346 endfunction

とりあえず、現状の設定で簡易的にRSpecに対応させることができる。「:Rspec」の存在が気持ち悪いのであれば、それは消して開いているファイルがControllerかModelか自分で判断して「:Rspeccontroller」か「:Rspecmodel」を使いわければいいと思う。「:Rspec [tab]」でエラーが出るし個人的には気持ちわるいんだけど、対応させたスペックを開くことの方がおおいし、その時は短いコマンドの方が都合がいいのでここらへんは妥協。今回Viewには対応させていないけれど、同じ要領でできるはず。

rails.vimを少しよんだだけだし、実際の動作もまともに検証してないので変な動作したらごめんなさい。まぁ致命的な問題は起きないだろうけど。正式にrails.vimがRSpecに対応してくれるといいんだけどね。

RE:Rails初心者はどうやって他人のRailsコードを読めばいいか

オレもRailsを初めて3ヶ月(もうちょいあるかも)たったので、ある程度オレの経験を元にまとめてみる。参考になるといいなー。

1. まずはアプリケーションを実際に動作させる

% ruby script/server

とりあえずコード読む前にそのアプリケーションがどんなものを把握するのが重要。コード読んでもわかるだろうけど、実際にブラウザでいじくりまわした方がはやく理解できると思う。その時にコントローラー名とアクション名もみといた方がよさげ。

2. モデル図を書く

これはid:Hash本人も重要って書いてたけど、ほんとに重要。そんなにキレイな図とかじゃなくていいから、紙とかに多対多なのか1対多なのかとか、参照名はなにかとかぐらいメモがてら書いておくと吉。モデルの関連さえ把握できれば、そのRailsアプリの半分以上理解できたも同然ってぐらい重要。

3. Logをみる

% tail -f log/development.log

開発時にも言えることだけどなるべくLogはみた方がいい。log/の下にdevelopment.log(多分ないと思うけど、productionで動作させてるならproduction.log)があるのでtailコマンドとかでみるといい。フォームのsubmit時のパラメータが見れたり、あとはlogger.infoで出力をチェックしたりとかできる。

4. script/consoleを使う

% ruby ./script/console

基本的な使い勝手はirbと同じ。irbと違うのはRails環境があらかじめロードされていること。例えば、モデルのメソッド名を呼び出したりとか。メソッドレベルで動作をみたい場合に便利。あと、2.0以降からモデル名を入力するとカラムの一覧も表示される。

>> User
=> User(id: integer,  created_at: datetime, updated_at: datetime)
>> User.find(:all)
=> []
>> user = User.new
=> #

test(or spec)があれば見る *追記08/06/04*

できれば「test(or spec)があれば、見ろ」も入れて欲しい。
あれは「どういう挙動をして欲しいか」=「どう使うか」が書いてあるんだから、
どんな構造のアプリなんだか理解する助けになるよ。
てか、ならないなら書く意味ないもの。

コメント欄での指摘。このエントリを書こうと決めたときは書くつもりだったのに、実際に書いたら忘れてたっていう。

thx、faultier。

まとめとオマケ

なんかTips的なエントリになったけど、とりあえずざっと思いついたのはこんな感じ。あとはコントローラのアクションからスタートして、モデルのメソッドや一連の流れを追えばいいんじゃないかな。コントローラーのアクションも上から順に読むよりは、機能ごとの流れで追った方がいいと思う。例えば、new->create->showとかedit->update->showとか。実際はもうちょい複雑な場合もあるだろうけど。実際の流れがどんな風になってるかは実際にアプリを動かしながらURLを確認したり、ログの出力やビューのフォームのアクションを見れば大体わかるはず。

あとはオマケ的な指摘だけど、Railsが2系であればビューファイルの拡張子は「.rhtml」より「.html.erb」の方がいい。この辺はActionPackのマルチビューに関係してる。この辺は初心者のうちはとりあえず「.html.erb」にしとくぐらいでいいと思うし、なによりオレがマルチビューについてまだちゃんと理解してないので詳細ははぶく。サーセン。

respond_toは1つのアクションで複数のフォーマットを出力するときに使う。

respond_to do |format|
  format.html
  format.xml { render :xml => @user }
end

上記のように書くと、ブラウザからの通常アクセス時はhtmlを、WebサービスなどでXMLを指定された場合はXMLを出力する。Webアプリは、例えばブラウザからのアクセスとAPIでのアクセスで、処理は同じだけど出力が違うなんてことがあったりする。そういうときにrespond_toで指定してやることで無闇にアクションを増やさなくてすむ。

Railsレシピブック 183の技
Railsレシピブック 183の技 高橋 征義

ソフトバンククリエイティブ 2008-05-31
売り上げランキング : 1080

Amazonで詳しく見る by G-Tools

RailsによるアジャイルWebアプリケーション開発 第2版
RailsによるアジャイルWebアプリケーション開発 第2版 前田 修吾

オーム社 2007-10-26
売り上げランキング : 8708

おすすめ平均 star
star充実した内容でわかりやすい
starrailsが良いのかrubyが良いのか本が良いのか
star1日に少しの時間で成果が分かる1冊

Amazonで詳しく見る by G-Tools

MacBookにRailsの自動テスト環境を構築した

なんかautotestが流行りつつある今日この頃ですが、みなさまいかがお過ごしでしょうか。とりあえず丁度うちの会社でも自動テストしようかーみたいな話がでてたので構築してみましたよ!

ZenTestのインストール

とりあえずは定番のZenTest(autotest)とRedGreen(結果の色付け)をインストールします。

$ sudo gem install ZenTest
$ sudo gem install RedGreen

次にautotestの設定ファイルの作成。example_dot_autotest.rbのパスは人によって違うと思うので適当に読み替えてください。

cp /opt/local/lib/ruby/gems/1.8/gems/ZenTest-3.9.1/example_dot_autotest.rb ~/.autotest

~/.autotestの15行目のコメントアウトを解除。

require 'autotest/redgreen'

RAILS_ROOTでautotestを実行。起動時に全部のテストを実行するのでちょっとだけ重くなるかもしれません。それ以降はテストファイルやモデル、コントローラファイルなどを修正する度に該当のテストが走ります。

$ cd RAILS_ROOT
$ autotest

実行するテストはtest/unit、もしくはRailsにRSpecが入れてあればRspecのテストを実行します。

なんかspec_serverを立ち上げておくと処理が早くなるらしいですがよくわかってないです。まぁとりあえず設定しといて損はなさそうです。

$ vi spec/spec.opts # 最下行に --drb を追記。drbでテスト用サーバへ繋ぐようになります。
$ ruby script/spec_server

テストの結果は成功なら緑色のバーが、失敗なら赤色のバーが表示されます。

結果通知用にGrowlとScreenの設定をする

これでも自動テストは走るので問題ないですが、結果を見るのがちょっと面倒ですね。ということでGrowlとScreenで結果が見えるようにしましょう。

screenの場合は角谷さんのエントリーを見るといいと思います。基本的にそのまま~/.autotestにコピペするだけで問題ないはずです。

require 'autotest/screen'   # コメントアウトを外す

Autotest::HOOKS.delete(:interrupt)
Autotest::Screen.statusline = %q[|%c %m/%d|%w %=]

class Autotest::Screen
  SCREEN_COLOR[:green] = 'gw'
  SCREEN_COLOR[:yellow] = 'yk'

  Autotest.add_hook :run_command do |at|
    message 'Running' if execute?
  end

  Autotest.add_hook :quit do |at|
    clear if execute?
  end

  Autotest.add_hook :ran_command do |at|
    return unless execute?
    results = [at.results].flatten.join("¥n")
    output = results.slice(/(¥d+)¥sexamples?,¥s*(¥d+)¥s.*failures?(?:,¥s*(¥d+)¥s.*pendings?)?/)
    if output
      ex,fail,pend = $~.captures.map {|e| e.to_i}
      if 0 < fail
        message "FAIL #{ex}ex, F:#{fail} ", :red
      elsif 0 < pend
        message "Pend #{ex}ex, F:#{fail} P:#{pend}", :yellow
      else
        message "All Green #{ex}ex", :green
      end
    end
  end
end

この設定でscreenとautotestを起動しておくと、ステータスバーの右側にテストの結果が表示されます。

autotest

これ貼ってから気づいたけど、Terminalから透けてみえる絵がなんかあれですなw

次にGlowlの設定ですが、Leopardではruby-growlのインストールが必要っぽいです。とりあえずmacportsからインストールしておきましょう。それとGrowlの設定でリモートを許可しておきましょう。

$ sudo port install ruby-glowl

Growl

Growlで結果を通知するにはgrowlnotifyのインストールが必要です。もしインストールしていなければ本家からdmgファイルをDLし、その中にあるinstall.shを実行します。

$ cp -r /Volumes/Growl\ 1.1.2/Extras/growlnotify ~/tmp
$ cd ~/tmp/growlnotify
$ sudo ./install.sh
$ growlnotify -m "hoge" # growlの通知が表示されればインストール完了

~/.autotestを修正し、glowlで結果が通知されるようにします。

require 'autotest/glowl' # コメントアウトを解除

これでテストが失敗したとき、失敗から成功になったときにGrowlが通知してくれます。Growlの見た目を変更しようと思ったけれど、個人的にscreenだけで十分だったので今回はナシ。

とりあえず自動テストはテストを書くのが楽しくなりますな。オススメ。

VimでRuby on Railsの開発する為の環境構築

ちょこっとだけ環境整えたので忘備録エントリとして。

Vim/Rubyのインストール

Ruby(.rb)とeruby(.rhtml)ファイルでシンタックスハイライトとオムニ補完が有効になる拡張。gemからインストール可能。

$ sudo gem install vim-ruby
$ vim-ruby-install.rb

vim-ruby-install.rbを実行するとインストール先の選択肢が表示される。1が自分のみ、2が全体へのインストールになる。基本的にどちらでもいいと思うけど、今回は1を選択しといた。

オムニ補完のの入力が面倒なのと、補完がRailsのメソッド名にも対応するように.vimrcを修正する。タブで補完できるInsertTabWrapper()はVim の自動補完候補表示 – 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 – subtechよりコピペ。

set nocompatible

syntax on
filetype on
filetype indent on
filetype plugin on

"omni
function InsertTabWrapper()
  if pumvisible()
    return "\"
  endif
  let col = col('.') - 1
  if !col || getline('.')[col -1] !~ '\k\|< \|/'
    return "\"
  elseif exists('&omnifunc') && &omnifunc == ''
    return "\"
  else
    return "\\"
  endif
endfunction
inoremap  =InsertTabWrapper()

" rubycomplete.vim
let g:rubycomplete_buffer_loading = 1
let g:rubycomplete_rails = 1
let g:rubycomplete_classes_in_global = 1

Rails.vimのインストール

rails.vim まとめ – 川o・-・)<2nd lifeを参考にインストール。インストール方法は・・・リンク先参照でw

.vimrcに以下を追記。

" rails.vim
let g:rails_level=4
let g:rails_default_file="app/controllers/application.rb"

対応ファイル切り替えがかなり便利。

まだ補完と対応ファイル切り替えぐらいしか機能を使えてないので、追々使い方を学んでいこうと思う。

追記: 2/18 omni補完でvimが落ちる問題

omni補完をするとvimが落ちる問題が発生している。

im: Caught deadly signal ABRT
Vim: preserving files...
Vim: Finished.

普通のRubyプログラム上では問題なく補完できる。(例えば10.toで10.to_sに補完とか)問題はRailsの方の補完で例えばmodelでvalidaとすると上記のエラーと共にvimが落ちる。とりあえず、rails.vimを外すとちゃんと補完できるようだけど、ファイル切り替えが便利なので悩み所。うまく共存させる方法はないのかな。

RetrospectivaをMacBookに設置してみた

blog . retrospectiva

どんなものか試しに設置してみた。あくまで試しなのでSQLite、WEBrickで。まずは必要なソフトのインストールから。

SQLite3のインストール

MacPortsを使ってSQLiteを、RubyGemsを使ってSQLiteを扱うライブラリをインストール。

% sudo port install sqlite3
% sudo gem install sqlite3-ruby

retrospectivaの設置

Quick Install – wiki . retrospectivaを参考にしつつ。

% svn export http://retrospectiva.googlecode.com/svn/branches/1-0 retrospectiva
% cd restrospectiva

リポジトリからファイルを持ってきたら、DBの設定がMySQLになっているのでSQLiteの設定に変更。

% mv config/database.yml.todo config/database.yml
% vim config/database.yml

database.yml

development:
  adapter: sqlite3
  database: retrospectiva_development

test:
  adapter: sqlite3
  database: retrospectiva_test

production:
  adapter: sqlite3
  database: retrospectiva

rakeは試しなのでdevelopment(引数なし)で。特にエラーがでないようならWEBRickを起動してhttp://localhost:3000/にアクセス。

% rake db:retro:load
% ruby script/server

IDとパスワードを聞かれるので admin / passwordを入力。

適当にプロジェクトを作ってみた感じが以下のキャプチャ。

SVNの連携とかはまたそのうち。Rails環境があれば、とりあえず起動するのはラクチン。

MacBookにRubyOnRailsをインストールする

Railsを試すためにMacBookにRubyOnRailsをインストールしてみました。MacPortsは既にインストールされてるものとして話を進めるので、インストールしていない人はGoogleで調べるなりしてインストールしてくださいな。と言ってもRubyGemsのインストールでしか今回は使いませんけど。

まずはRubyGemsをインストール

MacPortsを利用してRubyGemsを入れます。rb-rubygemsという名前で登録されているはずです。

% sudo port install rb-rubygems

install gem

というかRubyGemsってなに?

いわゆるパッケージマネージャーってやつです。Perlで言うところのCPANみたいなものです。Rubyはまだ標準のパッケージマネージャーはありませんが、Railsがインストールできるということもあってか大抵はRubyGemsが使われるようです。

gemからRailsをインストール

% sudo gem install rails

install rails

gemをインストールしてしまえば、コマンド一発でRailsがインストール出来てしまいます。簡単ですね。

プロジェクトを作ってみる

% rails hello

create project

gemでRailsをインストールしたら、プロジェクトを作ってみましょう。helloというディレクトリが出来て、その中にappディレクトリやRakefileとかが作られていれば問題ありません。ちなみにhelloというのはプロジェクト名です。

おまけ

キャプチャのMelchiorっていうのはエヴァネタです。マギシステムの。痛い子ですみません。

Home > Tags > Rails

Feeds
Meta
Others

Return to page top