はじめてのRuby on Rails、トラブル記録
スポンサーサイト

一定期間更新がないため広告を表示しています

posted by スポンサードリンク | | - | - | - |はてなブックマーク - スポンサーサイト
Mac OS 10.8でRails×Postgresql×Heroku環境を整える
 今まで開発に使ってたWindows7のデスクトップがかなり動作がヤバい感じだったので、新しいPCを買いました。MacBook Airにしちゃいました。13年ぶりのMacだし開発で使うのは初なので色々わからないことだらけ!

そんなわけで、環境構築までのステップを覚え書き。
●前提
OS: MacOS 10.8.4
今までWindows7でやってたプロジェクトがある:Ruby1.9, Rails3.2
インストールしたパッケージとrubyのバージョン管理はHomebrew+rbenvが良さそうだったのでそれで。

●セットアップするもの
1. Ruby2.0と1.9.3
2. Rails3.2
3. git
4. Postgresql
5. Heroku

1. rubyのインストール

以下のサイトに従って入れました。
  
viで~/.gemrcを記事の通りの内容で作成したものの、次のステップでfailed to load .gemrcと出ました。vimはようわからなくて苦手だからmiというテキストエディタを入れて、ユーザーフォルダ直下に.gemrcを作成したらうまくいきました。それ以外には特に詰まったところもなし。

ほかにもこのあたりを参考に見たり。
Ruby on Rails 3.2 を Mac OS X にインストールする手順をかなり丁寧に説明してみました:http://www.oiax.jp/rails/zakkan/rails_3_1_installation_on_macosx.html
【初心者向け】Mac OSX10.8(Mountain Lion)で Ruby on Railsを動かすための5ステップ:http://pplog.org/?p=2155

2. Railsのインストール

bundlerをまずインストール。
gem install bundler

その後
bundle install

それだけ。

【注意点】
rbenvだと、各rubyバージョンごとにgemでインストールしたやつを持つみたい。
バージョン切り替えてやるときは各バージョンごとにbundle installが必要。

3. gitのインストール

brew install git

4. Postgresqlのインストール

Homebrewを使ったPostgreSQLのインストール(Mac OS Lion):http://qiita.com/tstomoki/items/0f1a930bd42a8e1fdaac

基本的には上のページの流れでやれば良かったのだけれど、プロジェクトホームでrake db:migrateをやったら以下のようなエラーが…。
could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?

これの解決方法を見つけるのに何日かかったことか!
結果解決方法はえらいシンプルな方法だった…。なんと、database.ymlのdevelopmentとtestに以下の一行を追加するだけだった!
host: localhost
Postgres permission denied on MAC OS X
http://stackoverflow.com/questions/10791904/postgres-permission-denied-on-mac-os-x

5. Herokuのインストール

普通にオフィシャルのガイドを見て。

pushしようとしてsslの鍵を持ってきていないことに気づく。。。
旧マシン(windows7)にあったid_dsaとid_dsa.pubを$USER/.ssh以下に置いてpushしたら
Permissions 0644 for '/Users/$USER/.ssh/id_dsa' are too open.
などと怒られる。
なので、パーミッションを変える。
chmod 0600 ~/.ssh/id_dsa
参考: MacでSSH公開鍵・秘密鍵ファイルをコピーして使ったら警告がでた http://blog.ruedap.com/entry/20110404/mac_ssh_key_copy_error

これで無事push成功!
posted by トモト | 01:56 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Mac OS 10.8でRails×Postgresql×Heroku環境を整える
Rails3.0から3.2.11にアップデートした時に引っかかったところ
Rails3.0のプロジェクトを3.2.3にアップデートしたら色々な所で引っかかりまくりましたびっくり
3.2.0で新規PJは作ったことがあったから(まだ途中だけど)すんなり行くかなと思ったんだけど、全然!どこがマイナーバージョンアップだよ悲しい
asset_pipelineを使わないようにすればもう少し楽に行ったのかもしれないけど。。。

てなわけで、今後のために引っかかったところメモ。

ActiveModel::MassAssignmentSecurity::Error

以下のエントリを全文読むこと推奨。
参考: github の mass assignment 脆弱性が突かれた件

とりあえず急ぎで動かしたいなら以下の対応。 config/application.rb
config.active_record.whitelist_attributes = false
デフォルトはtrueだけどこれをfalseにに。ただ、できればattr_accessibleの設定をした方が良さそう。



ArgumentError (A sender (Return-Path, Sender or From) required to send a message)

Mailer内の各メソッド内でmailメソッドを呼んでないとメールが送られなかった。
[OLD]
class NotifyMailer < ActionMailer::Base
 default :from => 'hogehoge@hoge.com', :to => @recipients, :subject => @subject

 def receive_message(message)
  setup_email(message.recipient_id)
  @subject += I18n.t("You received a message")
  @message = message
 end
end
[NEW]
class NotifyMailer < ActionMailer::Base
 default :from => 'hogehoge@hoge.com'

 def receive_message(message)
  setup_email(message.recipient_id)
  @subject += I18n.t("You received a message")
  @message = message
  mail :to => @recipients, :subject => @subject
 end
end
私のケースではdefaultでfrom, to, subjectのパラメータを全て設定していて、ActionMailer内の各メソッドでは明示的にmailメソッドを呼んでいなかったのが、どこかのバージョンから呼ばないといけなくなったようです。

元々はdefaultでtoとsubjectを設定してたのも、メソッド内でmail()でやってみたらtoとsubjectがちゃんと設定されてなかったのでメソッド内で設定することに。defaultで設定できる方法もあるかもしれないけど、とりあえずこれで動いたのでいいやってことで。。。

あとはこれ以外にも、ActionMailerのメソッド内に分岐があって、Mailerメソッドを呼んだのにメールを送らないというケースには別の対応が必要な模様。その場合には以下の記事を参考に。
参考: Rails 3 - abandon sending mail within ActionMailer action


<% form_for ... が表示されなかった

これはRails2.3の頃の名残だけど…まだ残ってたのでくもり
[OLD]
<% form_for @hoge do |f| %>
[NEW]
<%= form_for @hoge do |f| %>
posted by トモト | 00:02 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3.0から3.2.11にアップデートした時に引っかかったところ
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月版)
Rails3で仮想モデルを作る
フォームで、DBにテーブルは持ってないけどバリデーションはしたいって時がある。
仮想モデルが作れれば万事解決なんだけどと思ったら、やっぱりできました。

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

モデル内のinitializeクラスとpersisted?クラスは書かないとエラーが出るよ。
posted by トモト | 19:02 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3で仮想モデルを作る
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の設定
Rails3でカスタムバリデーション
Rails3ではValidationがかなり変わりました。色々てこずったのだけど、さくっとできるナイスな手順を書いておきまーす。

 【1】Validation用のフォルダを作る

私はlibの下にvalidatorsフォルダを作りました。

 【2】validatorsフォルダを自動的に読み込むようにする。

config/application.rbに、以下の一行を追加します。
config.autoload_paths += %W(#{config.root}/lib/validators)

class Application < Rails::Applicationの中のコメント上から5行目あたりに書き方の見本があります。
そこに書けばよろしいかと。

【3】カスタムバリデーションを書く


クローバー validates_eachの場合
これは、フォームで年月だけを入力して、その入力された月が今月より前かどうかを判定するバリデーションです。

lib/validators/before_month_validator.rb
class BeforeMonthValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors[attribute] << 'must be before or equal to this month' if value.beginning_of_month >= Time.now.beginning_of_month.to_date
  end
end
Model
validates :since, :before_month => true

注意点
  • validates_eachの場合は、ActiveModel::EachValidatorになる。
  • モデルではファイル名からvalidatorを抜いた名前で呼べばいい。
それくらいしかないかも。validates_eachの方はめっちゃ簡単です!

クローバー validates_withの場合
lib/validators/different_from_validator.rb
class DifferentFromValidator < ActiveModel::Validator
  def validate(record)
    if record.send(options[:a]) == record.send(options[:b])
      record.errors[:base] << "#{options[:b]} must be different from #{options[:a]}"
    end
  end
end
Model
validates_with DifferentFromValidator, :a => :since, :b => :until

注意点
  • 複数の値を見るバリデーションはvalidates_withを使う。validates_eachでできないか挑戦したけどできず。
  • validates_withの場合はクラス名フルネームで呼ばなきゃいけない。
  • validates_withの場合はActiveModel::Validatorになる。
  • def validate(record)と(record)を入れる。
  • モデル側で「:hogehoge => :nantoka」と書いたオプションを「options[:hogehoge]」で値を取れる。
  • record.send(options[:a])で:aのvalueを取得。
    :a => :since / record.send(options[:a])だったら、Rails2.xだったらself.sinceと書いてるとこ。

self.hogehogeが使えなくて、どうやって値を取るのかかなり探してしまった……汗
バリデーションのファイル名は必ず「なんとかかんとか_validator」にしなければなりません。validatorついてなかったら読み込んでくれなかった。クラス名とファイル名も一致してないとだめだった。
たくさんのバリデーションを一つのファイルに書く方法はあるのかな?謎。

でも一回やり方わかってしまえば、シンプルに書けて使い回しできるのでとても便利!
Rails2.xの時にはかなりぐちゃぐちゃになりがちだったので、コードがすっきりしてうれしい楽しい
posted by トモト | 18:15 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3でカスタムバリデーション
Rails3でjQueryを使う
WEB+DB Pressを参考にしつつ…

railsでjqueryを使うには、jquery-ujsというプラグインを使えばいいみたいです。
jquery-ujs: https://github.com/rails/jquery-ujs

ほとんどgitに書いてあるまんまですが以下手順。
1
gem 'jquery-rails', '>= 0.2.6'
2
bundle install
3
rails g jquery:install
特に何も意識せずプロジェクトを作ると、prototype.jsがpublic/javascriptの中に予め入ってるんですが、jqueryを入れたとき、それがあるとバッティングしてよろしくないらしいです。
しかし、rails g jquery:installをやると、必要なjsファイルを追加してくれるだけでなく、そのいらないprototype.js関連のファイルを消してくれます。すばらしい!!

ところで、ここでjquery:installすると、以下のようなエラーが出ることがあります。(私は出ました)
D:/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:677:in `connect': SSL_connect retu rned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

そんな時には、config/application.rbの末尾にでも以下の2行を追加すれば回避できる模様。
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

【参考】aki note: Rails3 で jQueryUI を使いたい!protptype.js から jQuery に移行するよ
posted by トモト | 23:18 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3でjQueryを使う
Win7 64bitの場合Rails3と一緒に結局現状どのRubyを使えばいいのか(2011年2月版)
Rails3に移行しようと思ってインストールしたとき、Windowsであるせいでひっかかる箇所もちょいちょいありますが、それより何よりトラブルのもとは64bit!
64bitでさえなければ起こらなかった問題がどれだけたくさんあったことか

RubyとRailsを入れて、サンプルプログラムを動かそうとするのに、解決不能なエラーに多数ひかかってどうしてもうまくいかなくて、結局rubyとrailsいろんなバージョンの組み合わせを試すはめになりました……。

64bitのWindows機でトラブってここに辿り着く人がどれだけいるかわかりませんが、まあ誰か助けられれば幸いということで。

  • Ruby1.9.2 x64 + Rails 3.0.3 ×
    MySQL2のGemのインストールの時に、以下のようなエラーが出て、さんざん探し回ったんだけれど、結局解決法が見つからなかった。
    ERROR: Failed to build gem native extension.

    C:/Ruby19/bin/ruby.exe extconf.rb
    checking for stdio.h... * extconf.rb failed *
    Could not create Makefile due to some reason, probably lack of
    necessary libraries and/or headers. Check the mkmf.log file for more
    details. You may need configuration options.

    Devkitを入れるというのはちょいちょい見られたので試したけど、Devkitの後にするgem install rdiscount --platform=rubyでまた別のエラーが出たりして、結局一番根本のところは解決してないようだった。諦めた。
    MySQL使ってなければ状況は違うかもしれないけど、わからない。

  • Ruby1.8.7 x32 + Rails 3.0.3 ×
    最初すんなりセットアップできて、良さそうかと思ったんだけど、rails3のプラグインでRuby1.9の文法に依存しているものがあり、アウト。

  • Ruby1.9.2 x32 + Rails 3.0.3 ○
    実は1.8.7を試してみた後、1.9.1を試したりもしたんだけれど、1.9.2 x64とあまり状況は変わらなかった。それで、どうも引っかかっている箇所の原因がx64だからっていうのがあったみたいだったので、x32版を試してみることにした。

    そしたらなんと……うまくできた!
    64bitマシンだからって64を選ばず32のがうまくいくってどういうことさ

    いくつか足りないdllがあるので追加する必要はあるけれど、足りないものはRails2.xのインストールの時に必要だったものと同じだった。

    なので、以下のエントリが参考になります。
    Windowsでのrubyのインストール・セットアップ方法
    Windowsでruby gemsをインストールする
    Windowsでrailsをインストールする

    dllを入れるときの注意。32bit版のものでないと以下のエラーが出ます。
    193: %1 は有効な Win32 アプリケーションではありません。

あまり気にしてなかったけど1.8.7の時も実はx32版でやっていたので、あとはこの1.9.2 x32でうまくいってくれるといいんだけど……。
posted by トモト | 21:08 | Rails3.x | comments(3) | trackbacks(0) |はてなブックマーク - Win7 64bitの場合Rails3と一緒に結局現状どのRubyを使えばいいのか(2011年2月版)
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