2012-03-16

rails3で、あるactionに対してrouteがマッチしないケースがあった

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
複数のコントローラーで共通で使いたいactionがあるので、以下のようなcontrollerを作成して継承して使ってみていました。

class AaaController < ApplicationController
  def load
    ...
  end
  def loading
    ...
  end
end


実際に使う際は、こんな感じです。

class BbbController < AaaController
  def bbb
    ...
  end
end


rails 2.3の時は、なんの問題もなかったのですが、
rails 3.0にしてみたらBbbControllerでloadアクションが見つからなくなってしまいました。

ためしに、BbbControllerを以下のように変更したら、ちゃんと動くので気持ち悪い状態です。

class BbbController < AaaController
  def load
    super
  end
  def bbb
    ...
  end
end


rails c
で確認してみたところ、確かにloadメソッドはBbbControllerでも認識されているのに、actionとしては認識されていない状況でした。
irb(main):> c1 = AaaController.new
irb(main):> c2 = BbbController.new
irb(main):> c1.method(:load)
=> #<Method: AaaController#load>
irb(main):> c2.method(:load)
=> #<Method: BbbController(AaaController)#load>
irb(main):> c1.action_methods
=> #<Set: {"load","loading"}>
irb(main):> c2.action_methods
=> #<Set: {"loading"}>


一度AaaControllerからloadアクションを削除してみて確認したところ、Railsのどっかでloadメソッドが定義されていたことがわかりました。
irb(main):> c2 = BbbController.new
irb(main):> c2.method(:load)
=> #<Method: BbbController(ActiveSupport::Dependencies::Loadable)#load>

Railsのソースを見てみたところ、Controller内で定義されているものは、きちんとactionとして認識されるのですが、継承したmethodに関しては、すべてがactionと認識されるわけではなく、Railsのどっかで定義しているmethodに関してはactionにならないことがわかりました。

なのでloadが使えない対策は、loadの名称変更になりました。

共通のactionを使いたいということであれば、クラスを敬称させるのでなくてモジュールにしてincludeした方がよかったかなぁとか思ったりもしてみました。


2012-03-14

railsのhelperでparamsの値を使った時にspecでチェックをする方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのHelperでフォームからの値を格納しているparamsの値を使っている場合のテスト方法です。

以下のようなHelperがあったとします。

module AaaHelper
  def print_params_aaa_and_bbb
    "params aaa:#{params[:aaa]} bbb:#{params[:bbb]}"
  end
end

これをspecでチェックするには以下のような感じにします。

describe AaaHelper do
 it "should print aaa and bbb value" do
  params = {:aaa => "AAA",:bbb => "BBB"}
  helper.stub!(:params).and_return(params)
  helper.print_params_aaa_and_bbb.should == "params aaa:AAA bbb:BBB"
 end
end


2012-03-09

rails_sql_viewsを使っているrailsプロジェクトでrake specをしたら失敗した

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
migrationで都合によりviewも作りたいなぁと思ってrails_sql_viewsというのを使うことがあります。
gem install rails_sql_views
で入ります。
詳しくは、以下を。
http://activewarehouse.rubyforge.org/rails_sql_views/

で、ある日rake specが失敗するようになってしまいました。
ちなみにデータベースは都合によりSQL Serverを使っています。

rails_sql_viewsを使っていると
db/schema.rb
にview定義も入るようになるのですが、ものすごく定義文がでかくなるviewの定義が途中で切れてしまっていたのです。
このせいでrake specが失敗したのでした。

というわけで、

rails_sql_views/connection_adapters/sqlserver_adapter.rb
をちょっと修正しました。
#        q =<<-ENDSQL
#          SELECT view_definition FROM information_schema.views
#          WHERE table_name = '#{view}'
#        ENDSQL
        q =<<-ENDSQL
          SELECT SM.definition FROM sys.objects O JOIN
          sys.sql_modules SM ON O.object_id = SM.object_id
          WHERE o.type = 'V' and O.name = '#{view}'
        ENDSQL
viewの定義をschema.rbにdumpするためのsql文を修正です。
SELECT view_definition FROM information_schema.views WHERE table_name = '#{view}'
をSQL Serverで普通に実行しても確かに長い定義文のものはカットされています。

ちなみにSQL Serverでちゃんと使うにはく
rails_sql_views/connection_adapters/sqlserver_adapter.rb
の以下の部分も修正したほうがよさげです。
      def convert_statement(s)
        #s.sub(/^CREATE.* AS (select .*)/, '\1').gsub(/\n/, '')
        s.sub(/^CREATE.* AS (SELECT .*)/, '\1').gsub(/\n/, '')
      end


2012-03-08

藍の種をもらってみようと思ってみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
以前、ふと思い立ち綿花の種のプレゼントに応募してみました。
http://kingyo-bachi.blogspot.com/2012/02/blog-post.html

そして、またふと思い立ち藍も育ててみたいなぁと思ってみたのです。

そしてうまい具合に藍の種をプレゼントしていただけるのを発見しました。
http://rsb.mukogawa-u.ac.jp/~ushida/namahasm.html

ということで、また申し込んでみました。

藍の種は、今月ぐらいから蒔いてよいようなので、届いたら早速蒔きたいなぁと思ってみました。

2012-03-06

WBS「トレたま」で放送された商品をAmazonで検索してみた(201202放送分)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
WBSのコーナーの「トレたま」で放送された商品をAmazonで検索してみました。

楽器のようなスピーカー (放送:2月29日)
見つかりませんでした

拭き掃除専用クリーナー (放送:2月28日)
見つかりませんでした

アイフォン用特殊レンズ (放送:2月27日)
見つかりませんでした

撮れるゴーグル! (放送:2月24日)
amazonにありました



13種類の認証方法! (放送:2月23日)
見つかりませんでした

スイングが見える! (放送:2月22日)
見つかりませんでした

ごはんでおかず! (放送:2月21日)
amazonにありました




フタあってもつぶせる! (放送:2月20日)
見つかりませんでした

電池で見られるハイビジョン! (放送:2月17日)
見つかりませんでした

汗染み出ないシャツ! (放送:2月16日)
見つかりませんでした

自由に動く車いす! (放送:2月15日)
amazonにありました


ネットで対面販売! (放送:2月14日)
見つかりませんでした

室内で泳ぐ“こいのぼり” (放送:2月13日)
見つかりませんでした

スマホ対応カードリーダー (放送:2月10日)
見つかりませんでした

つまずかない?靴下 (放送:2月9日)
見つかりませんでした

ぬくぬく靴用クリーム (放送:2月8日)
見つかりませんでした

最先端!紙のスピーカー (放送:2月7日)
見つかりませんでした

5分で着物♪ (放送:2月6日)
見つかりませんでした

救命胴衣になるリュック (放送:2月3日)
見つかりませんでした

ペット用入浴洗浄剤 (放送:2月2日)
見つかりませんでした

石でできた小物 (放送:2月1日)
見つかりませんでした