第26回Rails勉強会@東北に参加してきました

https://www.facebook.com/events/153651131446402/
参加してきました。参加者4名。

MongoidのRailsCastsをやってみました。
http://railscasts.com/episodes/238-mongoid-revised


ハマったところを箇条書き。

  • MongoidはRuby1.9.3 でしか動かない
  • BigDecimalはまともに使えない? Product.let(:price => 100).sizeとかやっても文字列で比較しちゃってる感じだった。

MongoDBとMongoidにどっぷりという感じでした。
参加の皆様お疲れ様でした。

第25回 Rails勉強会@東北参加してきた

https://www.facebook.com/events/342159302538342/

参加者4人。

今回やった内容。

やった内容の参照先については、こちら

終了後、懇親会、二次会からSWWDC 2012/8/25 仙台iOS開発者勉強会の懇親会と合流。

久々にid:h_moriさんと話したりして楽しかったです。
参加の皆様お疲れ様でした。

Rails1.2.6のRailsアプリをRails3.2.8で作りなおしてデモサイトとして公開しました

公開したのは求人情報検索のデモサイトです。


実装作業はid:CortYumingさんにお願いしました。

進捗はRedmineで管理して、私がチケットを切って、CortYumingさんが作業するという形で進めました。

途中助言などは行いましたが、基本的に殆どCortYumingさんが実装を行なっています。

私がやった作業は、コードレビューのほかは、受け入れテストを書いたのと、リファクタリングを少々行ったぐらいです。


元々のアプリは、6年ぐらい前、まだ大学の事務職員だったころに就職支援の部署のために作成したもので、作成当時は確かRails1.1系だったと思います。

個人事業主になった当初、すぐに仕事も来ないだろうし、何かアピール出来るものをサイトに置こうとこのアプリをデモ用に用意して、URLを貼るばかりにしていました。

が、予想に反して(?)、仕事が繋がり、そのままお蔵入りにしていました。

最近ふと思いたち、せっかくなので(?)、Rails3.2系で作りなおして公開することにした次第です。

Resourceの命名などがアレだったりするのは、当時の自分がその程度だったので、作り直しを担当したCortYumingさんの責任ではないです。


Railsに関しては、2.3系の案件を請けた後、SOICHA AIRの開発等に携わったりして、一年以上本格的に触っていませんでした。

今回のデモサイトの件で、久々にRailsをがっちりやりましたが、やはりRails、というかRubyは楽しいですね。

自分のRailsの情報も2.3系までから3.2系にアップデート出来たので、良かったです。


最後に、現状二人とも受けられるお話はリモート限定ですが、仙台にフリーのRuby技術者が2名おりますことを、記憶の隅にでも留めておいていただけたら幸いです。

rails generate migrationで規約で生成してくれるのはaddとremoveだけ

メモ。Rails3.2.7で確認。

rails generate migration AddTitleBodyToPost title:string body:text published:boolean

こういうやつ↑
renameとかも対応してないかなと思って、念のためソースコード確認してみた。

#activerecord-3.2.7/lib/rails/generators/active_record/migration/migration_generator.rb 
        def set_local_assigns!
          if file_name =~ /^(add|remove)_.*_(?:to|from)_(.*)/
            @migration_action = $1
            @table_name       = $2.pluralize
          end
        end

なかったので、空のmigrationファイルを生成して、普通に記述した。

Capybaraとdatabase_cleaner

メモ。Capybaraでit "…", :js=>trueしてて、fixtureを使ってDBをどうこうする場合は、database_cleanerというgemを使うというのが定石っぽいですが。
1件削除とかちょっとした所で:js=>trueしたいだけだったので、削除のためのデータを、画面なぞって、フォームから作成して、そのデータをクリックして削除するといった感じにして、gemは導入しなかった。
必要になったら導入ということで。

Capybaraのdrag_toを使ってドラッグアンドドロップのテストを書いたら動かなかったのでSeleniumのdrag_and_drop_byを使って書いた

Request SpecとCapybaraで、jQuery UI のSortableを使った並び替え部分のエンドツーエンドテストを書いていて、ハマったのでメモ。


Capybaraのドキュメントを見てみるとdrag_toというメソッドがあったので、これを使ってみたけど、ドラッグアンドドロップされなかった。動き的には、ドラッグはしてるけど、ドロップした時に元の場所に戻ってる感じかな?

ちなみにコードはこんな感じ

     #drag&dropされない
     it "リストを並び替えると、「item2」が一番上に表示されること", :js => true do
        click_link "リストを並び替える" # 並び替えの画面に移動
        source = page.find_by_id("item_#{items(:item2).id}")
        target = page.find_by_id("item_#{items(:item1).id}")
        source.drag_to(target)
        within("#jquery-ui-sortable li:first-child") do
          page.should have_content("item2")
        end
      end


で、drag_toのソースコードを確認してみると、実際にはこれが呼ばれている。

resynchronize { driver.browser.action.drag_and_drop(native, element.native).perform }

Seleniumのメソッドなので、Seleniumドキュメントのdrag_and_dropを確認してみる。

def drag_and_drop(source, target)
  click_and_hold source
  move_to        target
  release        target

  self
end

drag_and_dropの中身で呼ばれているメソッドにバラして、なぞってみたりしたけど、やはりドラッグアンドドロップできていない。


他にいいメソッドはないかと、Seleniumのドキュメントでdragと入れて調べてみると、drag_and_drop_byという移動距離を指定するメソッドがあったので、これを使ってやってみた。

     it "リストを並び替えると、「item2」が一番上に表示されること", :js => true do
        click_link "リストを並び替える" # 並び替えの画面に移動
        source = page.find_by_id("item_#{items(:item2).id}")
        page.driver.browser.action.drag_and_drop_by(source.native, 10,-30).perform
        within("#jquery-ui-sortable li:first-child") do
          page.should have_content("item2")
        end
      end

ドラッグの移動距離を大きくしすぎると、scroll出来なかったりで、失敗したけど、適切な移動距離を指定したら動きました。

Capybaraのissueでdragと入れてググると、わりと既知な話だったみたい。
https://github.com/jnicklas/capybara/issues/119
https://github.com/jnicklas/capybara/issues/216
https://github.com/jnicklas/capybara/issues/222
https://github.com/jnicklas/capybara/issues/477

以上。