はじめてのRuby on Rails、トラブル記録
Rails3.2でのuninitialized constant Rake::DSLの解決方法
前にRails3.0.xを導入した時か3.1に変えた時に、rakeを実行したら
uninitialized constant Rake::DSL"
というエラーが出ました。

その時は、Gemfileで
gem 'rake', '0.8.7'
とrakeのバージョンを0.8.7で固定すれば解決できるってのを見て、実際それで解決。

でも今回railsのバージョンを3.2にしたら、また同じエラーが発生爆弾
今度はrakeのバージョンを指定しないで0.9.2.2を使うとか、固定にして0.9.2を使うっていう解決法が出てきたけどうまくいかずしょんぼり
rakeの古いバージョン削除すべきとか出てくるけど、プロジェクトによってまだ0.8.7が必要なものもあるからそういうわけにもいかず。

というわけで最終的に解決できたのがこの方法。
プロジェクトホームにあるRakefileというファイルに以下の一行を追加するだけ。
require 'rake/dsl_definition'

簡単解決!!ナイスグッド
このStackoverflowのこの質問のおかげです↓Thanks!
How to fix the uninitialized constant Rake::DSL problem on Heroku?
posted by トモト | 23:31 | エラー | comments(1) | trackbacks(1) |はてなブックマーク - Rails3.2でのuninitialized constant Rake::DSLの解決方法
Deviseでundefined local variable or method `resource_name'
Deviseでundefined local variable or method `resource_name'が出た時の対処。

application_helperに以下の内容をポイっと入れればOK。
def resource_name
   :user
end

def resource
   @resource ||= User.new
end

def devise_mapping
   @devise_mapping ||= Devise.mappings[:user]
end

"user"はdevise用に設定したモデル名なので、user以外の名前にしてたらそこは変更です。
posted by トモト | 15:33 | Devise | comments(0) | trackbacks(0) |はてなブックマーク - Deviseでundefined local variable or method `resource_name'
Rails3でdelayed_jobを使う
Herokuでも使える非同期処理プラグインのdelayed_job、Rails3で設定してみました。

delayed_job: https://github.com/collectiveidea/delayed_job

1 インストール
Gemfileに以下を追加。
gem 'delayed_job_active_record'
mongoidを使ってる場合は以下。
gem 'delayed_job_mongoid'

そして以下を次々と。
rails g delayed_job:active_record
rake db:migrate
delayed_job:active_recordでdelayed_job用のマイグレーションファイルができるので、
それをマイグレーションする流れです。

2 設定ファイルを作る
config/initializerにdelayed_job.rbを作って以下の内容を入れる。
Delayed::Worker.destroy_failed_jobs = false
# 実行失敗したジョブを削除:falseだとfailed_atに時間が入ってDBに残る
Delayed::Worker.sleep_delay = 60 # スリープタイム
Delayed::Worker.max_attempts = 3 # 最大実行回数
Delayed::Worker.max_run_time = 5.minutes  # 最長実行時間
Delayed::Worker.delay_jobs = !Rails.env.test? # テスト環境ではdelayed_jobをうごかさない
↓こちらのブログでこの辺の内容も詳しく説明しています。
[Rails][非同期処理]delayed_job設定方法まとめ


爆弾 出くわしたエラー集

1 マイグレーションファイルができなかった
実は最初はdelayed_job_active_recordじゃなくてgem 'delayed_job'でgemを入れたんです。Herokuのドキュメントにもこっちが書いてあったし。が、delayed_job用のマイグレーションファイルができませんでした。
それでこっちのdelayed_job_active_recordの方でやったらうまくいった次第です。

tobi/delayed_jobの方が本家のdelayed_jobなんですが、最近はcollective/delayed_jobの方がまめに更新されてて機能も豊富でちゃんと動くみたいです。

2 設定ファイル問題
delayed_jobを入れてプログラムを動かしてみたら、最初以下のようなエラーが出てしまいました。
uninitialized constant Delayed::Job
`method_missing': undefined method `destroy_failed_jobs='

原因は、config/initializer/delayed_job.rbの中に以下のように書いたから。
Delayed::Job.destroy_failed_jobs = false
silence_warnings do
Delayed::Job.const_set("MAX_ATTEMPTS", 3)
Delayed::Job.const_set("MAX_RUN_TIME", 5.minutes)
end
これも本家のdelayed_jobの方を見てこうしたんだけど。
上のエラーが出た人は設定ファイルの内容の方に書いたDelayed::Worker…の方で設定を書くと直るはず!

3 MailerにdelayをつけたらHerokuで動かなかった(Rails3)
Rails3でメーラーアクションにdelayをつける場合、以下のようにすると公式のドキュメントに書いてあります。
# without delayed_job
Notifier.signup(@user).deliver

# with delayed_job
Notifier.delay.signup(@user)

でも、この通りにしたのに動かない……しょんぼり
DBのdelayed_jobテーブルに残されたエラーログを見ると、以下のようにありました。
Class#sendnews failed with NoMethodError: undefined method `sendnews' for Class:Class

sendnewsのクラスはAdminMailerなのに、それが呼ばれてない風?
調べてみたら、バグっぽい…。
公式の方でもこの件で報告が上がってて、git上では解決されている模様。→↓
https://github.com/collectiveidea/delayed_job/issues/323

ただ、まだ最近fixしたばかりでgemに反映されていないので、delayed_jobのバージョンを落とすと直るということでとりあえず一時的にその対応。
Gemfileのdelayed_jobを以下のようにバージョン固定しbundle install。
gem 'delayed_job', '2.1.4'
最初に入れたのはver 3.0.0です。3.0.xとかにアップデートされたらそれで大丈夫だと思われ。
posted by トモト | 22:41 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3でdelayed_jobを使う
Windowsでruby1.9.xとrails3.xをインストールする(2012年1月版)
これまでにも何度かインストール周りのエントリは書いているのですが、情報が更新されたのでまた書きます。

1 Ruby Installer for windowsでRuby Installerをダウンロード&インストール
http://rubyinstaller.org/downloads/
RubyInstallersの項目から最新版を選んでダウンロード、インストール。
この時、インストールの時のダイアログで出てくる"Add Ruby executables to your PATH"にチェックを入れる。

2 DevKitをインストール
DevKitがないと、後々Gemをインストールしようとした時にエラーが出るものがあるので、最初に入れておくと吉。

DevKitの概要と詳しいインストール手順は以下にまとまってます。
https://github.com/oneclick/rubyinstaller/wiki/development-kit
  1. RubyInstallerのサイトのOther Useful Downloadsの中にあるDEVELOPMENT KITのファイルをダウンロード。
  2. exeを実行すると解凍すると言われるので、C直下とか適当な場所に空のフォルダを作ってDevKitとか名前をつけてその中に解凍。フォルダを作らないと全部その場に全部ぶちまけてくれるのでフォルダは作ってね!
  3. コマンドプロンプトで解凍したフォルダに移動
  4. ruby dk.rb init
    と入れる。
    RubyInstallerでRubyをインストールしたなら、場所を勝手に探してくれて、以下のような表示が出ます。
  5. ruby dk.rb install
    と入れる。
    以下のように表示されてDevKitのインストール完了!

3 ruby gemsがインストールされていなければインストール
コマンドプロンプトでgem -vといれてgemのバージョンが出ればインストールされています。
インストールされている場合はgemのupdateをしておきます。
gem update --system

gem -vでインストールされていないことが分かった場合はインストール。方法は以下。
関連エントリ:Windowsでruby gemsをインストールする

4 railsをインストール
gem install rails
posted by トモト | 14:34 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Windowsでruby1.9.xとrails3.xをインストールする(2012年1月版)
Deviseで他のコントローラーからログインフォームを呼ぶ方法
DeviseでSign inした後にブランクのページが表示され、406 Not Acceptableのエラーが出てしまってどうしてもうまくいかず、after_sign_in_path_forとかroutes.rbでuser_rootの設定いじったりとか散々悩んでもなかなか原因わからず悲しい

やっとたどり着いた原因は、users_controllerじゃないところからフォームを呼んでたから……!

それにしてもその方法も何かwiki何回も見たのに見落としてたみたいでなかなか見つからず、えらい苦労してしまった汗

別の場所(別のコントローラー)にログインフォームを設置する方法はここにありました↓あせあせ
https://github.com/plataformatec/devise/wiki/How-To:-Display-a-custom-sign_in-form-anywhere-in-your-app
posted by トモト | 23:59 | Devise | comments(0) | trackbacks(0) |はてなブックマーク - Deviseで他のコントローラーからログインフォームを呼ぶ方法
Rails3で仮想モデルを作る
フォームで、DBにテーブルは持ってないけどバリデーションはしたいって時がある。
仮想モデルが作れれば万事解決なんだけどと思ったら、やっぱりできました。

ここを参考にすればOK↓
http://railscasts.com/episodes/219-active-model

モデル内のinitializeクラスとpersisted?クラスは書かないとエラーが出るよ。
posted by トモト | 19:02 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3で仮想モデルを作る
RailsのlocalでYes、Noを使うときの罠
localeのymlファイルでは普通
hogehoge: ほげほげ
のように書くけれど、
Yes: はい
No: いいえ
はできない。
"Yes": はい
"No": いいえ
ならOK。
posted by トモト | 16:20 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - RailsのlocalでYes、Noを使うときの罠
named routesのform_forの書き方
Rails3のルーティング設定では、:as => hogehogeでルートの名前を変えることができます。

これを使って以下のように名前を変えました。
config/routes.rb
resources :usersettings, :as => :settings

そしたら、form_forが普通の形だと動かなくなりました冷や汗
デフォルトだとform_forはこんな風になっています。
<%= form_for @usersettings do |f| %>
でも、これだとNo route matchesが出てしまいます。

こうしたらちゃんと動きました。
New
<%= form_for @usersettings, :url => settings_path do |f| %>

Edit
<%= form_for @usersettings,
  :url => {:controller => :usersettings, :action => :update, :id => @usersettings.id } do |f| %>

Editの方がなんかもうちょっとすっきり書けないかと思うけど…まあこれで動くのでとりあえずこれでパー
posted by トモト | 23:45 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - named routesのform_forの書き方
Rails3 ActiveMerchantでPayPalの設定
PayPalの設定はホントめんどくさい。Rails2.3で作った前のプロジェクトはその名も「PayPal」というプラグインを使って実装したけれど、なくなってしまったのか、見つからないので仕方なくめんどくさそうだなーと前回回避したactivemerchantを使うことに。

・決済方法
PayPalの決済方法って色々あって、前はよくわかってなかったけどWeb Payment Standardを使っていた模様。
PostでPayPalに金額とか投げて、IPN(Instant Payment Notification)で支払われたらその情報をこちらのサーバーのデータベースに反映するという形。IPNについては詳細はググッてください。
でも、どうもExpress Check inという方がどうも良さ気な感じだったので、Express Check inにすることに。というか、サンプルソースがExpress Check inだったのでそっちのが楽だった汗

Web Payment StandardとExpress Check inの差は以下のサイトが参考になります。
PayPalの提供する決済サービスの種別 http://takahashifumiki.com/web/programing/1312/

・PayPal Express Paymentでの実装サンプル
なんとサンプルプロジェクトまるごと公開。記事の説明もわかりやすい。
多少プロジェクトに合わせてカスタマイズは必要かもしれないけれど、ほぼこのまま使える!感謝…!!
PayPal Express Payments with ActiveMerchants with ActiveMerchant

・PayPalAPIのUser name, Password, Signatureはどこでわかるか。
私はわからなかったので。
↓のページは画面のキャプチャつきでわかりやすいです。
http://help.wildapricot.com/display/DOC/Requesting+PayPal+API+Signature

・使う通貨を日本円に変える
config/environment.rbに以下の一行を追加
ActiveMerchant::Billing::PaypalExpressGateway.default_currency = "JPY"

・定期購読
定期購読の実装サンプルは以下のページが参考になります。
Active Merchant + Paypal Recurring Payment http://www.naivehack.com/2010/11/24/active-merchant-paypal-recurring-payment/
定期支払い周りの変数一覧(公式)
https://www.paypal.com/jp/cgi-bin/webscr?cmd=p/acc/ipn-subscriptions-outside

・PayPal公式ドキュメント
最後ですが。公式の注文管理統合ガイド。PDTとかIPNとかその他もろもろ。
これ見ただけれはできないけれど、全体的に知っておく必要が有りげな感じ。変数とかも載ってるので必須。
https://www.paypalobjects.com/WEBSCR-640-20110722-1/ja_JP/JP/pdf/PP_OrderManagement_IntegrationGuide.pdf
posted by トモト | 17:03 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3 ActiveMerchantでPayPalの設定
collectって便利
なんと説明すればいいのか、説明がしづらいのですが。
とあるモデルの検索結果の1カラムを使って、別のモデルを検索する方法とでもいいましょうか。

UserとFollowerという2つのモデルがあるとします。
FollowerはUserの子モデルです。

Followerにはuser_idとfollower_idがあります。
current_user.followersとすると、current_userをfollowしているuserのidが集まります。
このfollowerのuserモデルを全部集めたいのです。

そんなときは、collectを使えば一発!チョキ
@followers = User.where('id IN(?)', current_user.followers.collect(&:following_id))

すごい!簡単!まさしく探してたヤツ!!


【参考】http://wota.jp/ac/?date=20060309
posted by トモト | 00:00 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - collectって便利
Rails3レシピブック 190の技
Rails3レシピブック 190の技
ついにRails3対応版が出ました!!
WEB+DB PRESS Vol.58
WEB+DB PRESS Vol.58
Rails2系から3への移行時に知りたいことがひとまとまりになっててよかった!色々ググるよりこれを読む方が早い。
Rubyレシピブック 第3版 303の技
Rubyレシピブック 第3版 303の技
Rubyやるならこのリファレンスは必要。
Search this site