ブログ移設しました。

bloggerから記事を移設しました。


HUGOで記事を書いてみると思いのほか書きやすかったので移動。

月曜日, 12月 13, 2010

はまったエラー [Rails]

エラーログ抜粋
wrong number of arguments (1 for 0)
app/controllers/posts_controller.rb:5:in `initialize'
wrong number of arguments (1 for 0)
app/controllers/posts_controller.rb:5:in `new'
app/controllers/posts_controller.rb:5:in `index'

問題のコード
posts_controller.rbの5行目は
@search_form = SearchForm.new params[:search_form]

呼び出しているsearch_form.rbは、
class SearchForm
extend ActiveModel::Naming
include ActiveModel::Conversion

attr_accessor :q

def initialize(params)
self.q = params[:q] if params
end

def persisted?
false
end
end

これで分る人が大半だと思うんですが、上記のコードではまっていました。
extendするところ?違う。 includeするところ?違う。
原因は、initializeをinitilizeって書いていたんです。

エラー内容はこれでした。
consoleを開いて検証してみましょう。
:!rails console
Loading development environment (Rails 3.0.3)
irb(main):001:0> SearchFrom.new
NameError: uninitialized constant SearchFrom
from (irb):1
irb(main):002:0> SearchFrom.new(1)
NameError: uninitialized constant SearchFrom
from (irb):2
irb(main):003:0>

確かにuninitialize constatantって出ていますね。

正解の場合は?
irb(main):001:0> SearchFrom.new(1)
NameError: uninitialized constant SearchFrom
from (irb):1
irb(main):002:0>
だめじゃん。

ちょっと分らなくなったのでついでの寄り道。
Railsでデバッグをする7つの方法 - Hello, world! - s21g
使える方法もあるみたいなんだけど、ちょっと前の記事だったので、2系なのかなとおもって調べる
Using debugger in Rails 3 - Momoro Machine
rails3にはruby-debuggerが使えるとのこと。
そこで、この記事を頼りにruby-debuggerをインストールしてみる。(ruby1.8系だけどその辺はgemさんがなんとかしてくれるはず。
How to Debugging with "ruby-debug" on Rails3 Ruby1.9.2 RVM1.0 - zonolog
途中rvmを入れたほうがいいということで、gemを使って入れる。(まぁ、今回は使わないだろうけどね。)

rvmってなぁに?っていう人はRuby Freaks Lounge:第39回 RVM(Ruby Version Manager)による環境構築|gihyo.jp … 技術評論社を参照

インストール途中すごい長々と文章が表示されますが、ちゃんと読みましょう(こういうインストールしたときに出るログって読まないと痛い目見ることが多い気がするけど私だけ?)
読んでなかった人はこちら。rvm install.log

ruby-debugを入れてみて実際に動かしてみて画面をみていると、デジャビュ
確か大学時代にもやったな。。。。splhack: vim-ruby-debugger + MacVim
確かこれってvimに+clientserverでコンパイルしていないとだめだよなぁ。。。と思いながらみているとやっぱりゆうこうじゃないとだめ。ubuntuでてんこ盛りのパッケージをインストールしてみてもだめだった。 自分でmakeするしかないということがわかったので、後日改めて。

とりあえず、debug出来る環境だけは手に入れたので、ruby-debugをvimから使うのはまた日を改めて。
(ふと思ったけど、このブログに書いたものを移行するときたいへんそうだなぁ。。。。)
はっ。いかんいかん。

実際にdebuggerを動かしてみると、

[3, 12] in /home/luna/repos/git/blog_app/app/models/search_form.rb
3 include ActiveModel::Conversion
4
5 attr_accessor :q
6
7 debugger
=> 8 def initalize(params)
9 self.q = params[:q] if params
10 end
11
12
(rdb:48) n
/home/luna/repos/git/blog_app/app/models/search_form.rb:13
def persisted?
(rdb:48)

8が次の対象になるんだけど、nって押したらすっ飛ばしてpersisted?にとんだ。そういうことです。もういちどエラー内容を思い出してみましょう。
wrong number of arguments (1 for 0)
app/controllers/posts_controller.rb:5:in `initialize'
app/controllers/posts_controller.rb:5:in `new'
app/controllers/posts_controller.rb:5:in `index'

posts_controller.rbからsearch_form.rbをnewする。=> initializeないよ。=> ERROR
簡単な間違いなんですが、気づかないとまさかね。と思ってスルーして多大な時間をすごしてしまう羽目になってしまいます。
気づかないとき、デバッガーの存在があれば、私は2時間迷い続けるなんてことはなかった。。。

ここまではデバッグ方法

次に疑問に思ったのはconsoleからSearchForm.newってしたときに引数エラーが出た問題。あれの原因と、Consoleのときに一々APIを見てるのはだるいので、すぐに解決できる方法が無いかな?
と思ったけど、この問題に取り組むのはまた別の記事で。

0 件のコメント:

コメントを投稿