『LoadError: no such file to load --』のエラーについて

Railsでアプリを開発中にどうしてもirbを使って、
簡単なテストをしたい時がありますよね。
今回、Twitter Gemを使って開発しているのですが、
irbを起動後、requireすると、
『LoadError: no such file to load -- twitter』のエラーが発生しました。。

TK-2:~ Takashi$ irb
1.9.2p290 :001 > require 'twitter'
LoadError: no such file to load -- twitter

Twitter Gemはインストールしているはずなのに、なぜ?
とちょっと考えましたが、RVMで複数バージョンを動かしていて、
単純に実行している場所が間違えているのであろうと気付きました。
(もの凄く初心者ですみません。。)
そこでまずは、下記のRVMコマンドで実行場所のチェックをします。

rvm gemdir

すると、返って来ました結果が。現在、勉強中のRails Tutorialの方を
使っていたわけです。。

TK-2:~ Takashi$ rvm gemdir
/Users/Takashi/.rvm/gems/ruby-1.9.2-p290@rails3tutorial

Twitter Gemがインストールされているわけもなく。。
そこで、実行場所を下記のRVMコマンドで変更します。
※「ruby-1.9.2-p290」の箇所は環境により任意で変更して下さい。

rvm use ruby-1.9.2-p290

すると、無事に切り替わり、

TK-2:~ Takashi$ rvm use ruby-1.9.2-p290
Using /Users/Takashi/.rvm/gems/ruby-1.9.2-p290

再度、requireを試すと、

TK-2:~ Takashi$ irb
1.9.2-p290 :001 > require 'twitter'
 => true

正常にrequireされました!

『undefined method `each' for ...』のエラーについて

超基本中の基本。
ですが、RailsでWebアプリ作っている時に、このエラーが出て
ちょいと調べたので、調べたものは記しておこうという姿勢で行きます。

エラーメッセージの内容は凄く単純で、
『undefined method `each' for ...』
要するに、for以下の文言に出てくるオブジェクトに対して、
eachメソッドが定義されていないということ。
個人的には配列で返って来ると想定していたオブジェクトに使用して
いたのですが、どうも配列で返って来なかったみたい。
以下、簡単なテスト。

aを配列オブジェクトとした場合

1.9.2-p290 :001 > a = [1,2,3]
 => [1, 2, 3] 
1.9.2-p290 :002 > a.each do |a|
1.9.2-p290 :003 >     p a
1.9.2-p290 :004?>   end
1
2
3
 => [1, 2, 3] 

正常終了。

aを文字列オブジェクトとした場合

1.9.2-p290 :005 > a = "test"
 => "test" 
1.9.2-p290 :006 > a.each do |a|
1.9.2-p290 :007 >     p a
1.9.2-p290 :008?>   end
NoMethodError: undefined method `each' for "test":String

『undefined method `each' for ...』のエラーが発生します。
文字列オブジェクトはeachメソッドを持っていないこととなります。

Rails3で間違えてgenerate controllerしたものを取り消したい場合

引き続き基本的なことから。
現在、Railsを使って静的なページ作成(Respiraという個人プロジェクト用)
を始めましたが、誤って、generate controllerを実行してしまい、
この結果を取り消したいケースが発生しました。

 rails generate controller Respiras home about webapp contact

上記コマンドを実行した結果、

      create  app/controllers/respiras_controller.rb
       route  get "respiras/contact"
       route  get "respiras/webapp"
       route  get "respiras/about"
       route  get "respiras/home"
      invoke  erb
      create    app/views/respiras
      create    app/views/respiras/home.html.erb
      create    app/views/respiras/about.html.erb
      create    app/views/respiras/webapp.html.erb
      create    app/views/respiras/contact.html.erb
      invoke  test_unit
      create    test/functional/respiras_controller_test.rb
      invoke  helper
      create    app/helpers/respiras_helper.rb
      invoke    test_unit
      create      test/unit/helpers/respiras_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/respiras.js.coffee
      invoke    scss
      create      app/assets/stylesheets/respiras.css.scss

コントローラーはもちろん、ルートや各種erbファイル等が作成されてしまいます。

やり直す場合は、前出のコマンドのgenerateをdestroyに変更すれば良いです。

 rails destroy controller Respiras home about web app contact

コマンドの実行結果は、

      remove  app/controllers/respiras_controller.rb
       route  get "respiras/contact"
       route  get "respiras/webapp"
       route  get "respiras/about"
       route  get "respiras/home"
      invoke  erb
      remove    app/views/respiras
      remove    app/views/respiras/home.html.erb
      remove    app/views/respiras/about.html.erb
      remove    app/views/respiras/webapp.html.erb
      remove    app/views/respiras/contact.html.erb
      invoke  test_unit
      remove    test/functional/respiras_controller_test.rb
      invoke  helper
      remove    app/helpers/respiras_helper.rb
      invoke    test_unit
      remove      test/unit/helpers/respiras_helper_test.rb
      invoke  assets
      invoke    coffee
      remove      app/assets/javascripts/respiras.js.coffee
      invoke    scss
      remove      app/assets/stylesheets/respiras.css.scss

実行結果から、お分かりの通り、ファイルだけではなく、
ルートも奇麗に元通りです。素晴らしい!

Ralis3でSELECTタグを使う方法

本当に簡単なことでも書き記して行こうと思う。
誰かの助けになるのであれば、本望。

今日は自前のWebアプリにSELECTタグで抽出条件を
入力させる機能を実装しようとしていて、
ちょっと調べるのに時間掛かったので、書いておきます。

皆さんもお持ちでしょう、Rails3レシピブックには、SELECTタグを簡易的に作成する
方法として下記の記述がありました。

<%= select_tag("count", "<option>1</option><option>2</option><option>3</option>".html_safe) %>

でも、これではValue属性が指定出来ない。。
通常はユーザー側には、単語や分かり易い名称で選ばせて、
処理では、Value属性に入力されている値を使いたい。
そこで、下記のようにすれば、実装可能となる。
※自前のWebアプリ用コードです。

<%= select_tag("how_many_tweets", options_for_select([["Most Recent :最近の",0],["More Recent :ちょっと前も",1],["Older :かなり古いのも",2]])) %>

簡単なことも書いて行こうと思う。

Ruby on Rails 〜 ActionView::Template::Error (application.css isn't precompiled)のエラーについて

Rails3.1以降でアセットパイプラインの考え方が導入され、
ActionView::Template::Error (application.css isn't precompiled)」のエラーが
発生することがあるようです。

個人的にはアプリをherokuへディプロイ後、URLへアクセス時に発生しました。

解決方法としては、下記が参考になりました。
http://d.hatena.ne.jp/tetsuyai/20110920/1316504421

少し急いでいたのと、都度コンパイルでも速度的に問題無さそうだったので、
config/environments/production.rbの
「config.assets.compile」パラメータを「true」に変更し対応。
無事解決しました!

ただ、後でコンパイルする方法もやってみようと思います。

ActiveRecord::ConnectionNotEstablishedのエラーについて

Rails3.1以降でActiveRecordを使用していないアプリを
herokuへディプロイした場合、発生するエラー
ActiveRecord::ConnectionNotEstablished」の解決方法について、
ちょっとだけハマったので書いておきます。

ローカルの環境では問題が無く動いているので、原因が分からなかったのですが、
下記英語のサイトが助けてくれました。
http://www.benjaminoakes.com/2011/09/15/activerecordconnectionnotestablished-in-rails-3-1-on-heroku/

解決方法として複数上げてくれているのですが、個人的には
以下の流れで試してみました。

(1)spec/spec_helper.rbの修正

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, comment the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = true

コメントには、ActiveRecordを使用していないのであれば、
この設定をコメントにするか、trueをfalseでセットしなさいとある。
で、コメントもfalseもどちらも試してみたのですが、
エラーは回避せず。。

そこで
(2)config/application.rbの修正

  # Pick the frameworks you want:
  require "active_record/railtie"
  require "action_controller/railtie"
  require "action_mailer/railtie"
  require "active_resource/railtie"
  require "sprockets/railtie"
  # require "rails/test_unit/railtie"

「require "active_record/railtie"」を下記のようにコメント化。

  # Pick the frameworks you want:
  # require "active_record/railtie"
  require "action_controller/railtie"
  require "action_mailer/railtie"
  require "active_resource/railtie"
  require "sprockets/railtie"
  # require "rails/test_unit/railtie"

再度、herokuへディプロイ。動作確認。。。
無事に動きました!

結論から言うと(2)config/application.rbの修正を実施すれば良いかと思います。
ActiveRecordを使用しないアプリも多々あるでしょうから、
覚えておいて損は無いと思います。

※2012/02/12追記
どうやら、(2)config/application.rbに
「require 'rails/all'」の一文が追加になっているアプリもあるようです。
その場合、ここが邪魔することもあるようなので、私の場合、
コメント化してます。そうするとエラーが発生しなくなります。

『レバレッジ・リーディング』

レバレッジ・リーディング

レバレッジ・リーディング


何かと賛否両論ありそうな本ですが、個人的には良書と思います。
この本があったから、本をたくさん読むようになったし。
いわゆるハウツー本でしょ?と馬鹿にする前に一読の価値はあると思います。

職業、年齢、性別、出身等に関わらず、やっぱり人は本を読むことが
一番大切であることを気付かされます。

最近、出版された以下のものも、1時間もあれば読めると思いますので、
ぜひ読んでみて下さい。

とにかく本は読まないより、読んだ方がいいです!

リーディング3.0 ―少ない労力で大きな成果をあげるクラウド時代の読書術

リーディング3.0 ―少ない労力で大きな成果をあげるクラウド時代の読書術