さて、今回もWebのバックエンドのお話になります。Ruby on railsではモデルとコントローラーとビューがからまりあって機能を実装していくのですが、私がやっていたのは前回に引き続きgoogle anarytics apiの部分。google analytics apiは、apiを叩くのにanalytics apiに登録した際に発行されるアカウントサービスEメールアドレス、keyファイル、そして情報を取得したいサイトのViewIDが必要になります。これを個人によって動的に変化させて、それぞれのサイトのapiをワンクリックで叩けるようにしたかったのですが・・・
メソッドに引数が渡せてない??
railsでは、フォームなんかから入力してきた値をcontrollerで受け取り、コントローラー内のアクションでメソッドに受け渡すという処理をします。なので今回は、GoogleApiというクラスの中のinitializeメソッドに引数を渡すことにしてプログラムを組んでいました。initializeメソッドっていうのは、クラス.newが呼ばれた時一番最初に無条件で実行されるアクションみたいなやつです。他のメソッドへの引数の受け渡しと書き方は同じなので、api=GoogleApi.new(引数)みたいに書きます。そこで組んでいたのが以下のコードです。
・api_controller.rb
..... def result @id=params[:id] #フォームから受け取った値 api=GoogleApi.new(@id) end ....
・api.rb
require 'google/api_client' class GoogleApi def initialize(id) ID=id @client = Google::APIClient.new( application_name: 'xxxxx', application_name: '1.0' ) end .....
上のプログラムを走らせたところ、
wrong number of arguments (given 1, expected 0)
のエラーが出ました。色々調べてみると、呼び出し側の引数の数と、メソッド側の引数の数が一致していない時に起こるエラーらしいです。しかし今回は@idというのを呼び出し側の引数として与え、メソッド側でもidという引数を受け取るようにしてあるので数はあってるはず。。。。
結論から言うと変数に引数を渡していなかった
解決法の結論から述べると、引数を変数に受け渡していなかったわけですね。引数を直接メソッド内で使うのではなく、一度@id_getなんかの変数に受け渡してから@id_getを使うようにすると解決しました。でもそのままでも使えるはずなんですけどしっくりきませんね・・・
また、上のコードではIDという定数をメソッド内で定義してそこに代入しようとしていますが、これもエラーが出ます。メソッド内では定数定義はできないのと、定数というのは一度決めると他の値を代入して上書きというのができないそうです。よって書き直したコードは以下になります。
・api.rb
require 'google/api_client' class GoogleApi def initialize(id) @id_get=id @client = Google::APIClient.new( application_name: 'xxxxx', application_name: '1.0' ) end .....
まとめ
以外と小さいミスでハマっちゃうんですよね。バックエンドをいじってると小さなミスで動かなくなった時がすごい恐怖です。頑張ります。