スポンサーサイト
2013.07.04 Thursday
一定期間更新がないため広告を表示しています
はじめてのRuby on Rails、トラブル記録
Mac OS 10.8でRails×Postgresql×Heroku環境を整える
2013.06.18 Tuesday
今まで開発に使ってた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のインストール以下のサイトに従って入れました。Mac10.8にRuby2.0をインストール:http://kakikake2.wordpress.com/2013/03/17/mac-10-8-ruby-2-0-install/ 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成功! Rails3.0から3.2.11にアップデートした時に引っかかったところ
2013.03.24 Sunday
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
[NEW]
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
class NotifyMailer < ActionMailer::Base
私のケースではdefaultでfrom, to, subjectのパラメータを全て設定していて、ActionMailer内の各メソッドでは明示的にmailメソッドを呼んでいなかったのが、どこかのバージョンから呼ばないといけなくなったようです。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で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| %> Rails3でdelayed_jobを使う
2012.01.21 Saturday
Herokuでも使える非同期処理プラグインのdelayed_job、Rails3で設定してみました。 delayed_job: https://github.com/collectiveidea/delayed_job インストール Gemfileに以下を追加。 gem 'delayed_job_active_record'
mongoidを使ってる場合は以下。gem 'delayed_job_mongoid'
そして以下を次々と。
rails g delayed_job:active_record
delayed_job:active_recordでdelayed_job用のマイグレーションファイルができるので、rake db:migrate それをマイグレーションする流れです。 設定ファイルを作る 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設定方法まとめ 出くわしたエラー集 マイグレーションファイルができなかった 実は最初はdelayed_job_active_recordじゃなくてgem 'delayed_job'でgemを入れたんです。Herokuのドキュメントにもこっちが書いてあったし。が、delayed_job用のマイグレーションファイルができませんでした。 それでこっちのdelayed_job_active_recordの方でやったらうまくいった次第です。 tobi/delayed_jobの方が本家のdelayed_jobなんですが、最近はcollective/delayed_jobの方がまめに更新されてて機能も豊富でちゃんと動くみたいです。 設定ファイル問題 delayed_jobを入れてプログラムを動かしてみたら、最初以下のようなエラーが出てしまいました。 uninitialized constant Delayed::Job
`method_missing': undefined method `destroy_failed_jobs='
原因は、config/initializer/delayed_job.rbの中に以下のように書いたから。
Delayed::Job.destroy_failed_jobs = false
これも本家のdelayed_jobの方を見てこうしたんだけど。silence_warnings do Delayed::Job.const_set("MAX_ATTEMPTS", 3) Delayed::Job.const_set("MAX_RUN_TIME", 5.minutes) end 上のエラーが出た人は設定ファイルの内容の方に書いたDelayed::Worker…の方で設定を書くと直るはず! 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とかにアップデートされたらそれで大丈夫だと思われ。Windowsでruby1.9.xとrails3.xをインストールする(2012年1月版)
2012.01.17 Tuesday
これまでにも何度かインストール周りのエントリは書いているのですが、情報が更新されたのでまた書きます。 Ruby Installer for windowsでRuby Installerをダウンロード&インストール http://rubyinstaller.org/downloads/ RubyInstallersの項目から最新版を選んでダウンロード、インストール。 この時、インストールの時のダイアログで出てくる"Add Ruby executables to your PATH"にチェックを入れる。 DevKitをインストール DevKitがないと、後々Gemをインストールしようとした時にエラーが出るものがあるので、最初に入れておくと吉。 DevKitの概要と詳しいインストール手順は以下にまとまってます。 https://github.com/oneclick/rubyinstaller/wiki/development-kit
ruby gemsがインストールされていなければインストール コマンドプロンプトでgem -vといれてgemのバージョンが出ればインストールされています。 インストールされている場合はgemのupdateをしておきます。 gem update --system
gem -vでインストールされていないことが分かった場合はインストール。方法は以下。 関連エントリ:Windowsでruby gemsをインストールする railsをインストール gem install rails
Rails3で仮想モデルを作る
2011.11.23 Wednesday
フォームで、DBにテーブルは持ってないけどバリデーションはしたいって時がある。 仮想モデルが作れれば万事解決なんだけどと思ったら、やっぱりできました。 ここを参考にすればOK↓ http://railscasts.com/episodes/219-active-model モデル内のinitializeクラスとpersisted?クラスは書かないとエラーが出るよ。 named routesのform_forの書き方
2011.08.19 Friday
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の方がなんかもうちょっとすっきり書けないかと思うけど…まあこれで動くのでとりあえずこれで Rails3 ActiveMerchantでPayPalの設定
2011.08.04 Thursday
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 Rails3でカスタムバリデーション
2011.05.06 Friday
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
Model
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 validates :since, :before_month => true
注意点
validates_withの場合 lib/validators/different_from_validator.rb class DifferentFromValidator < ActiveModel::Validator
Model
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 validates_with DifferentFromValidator, :a => :since, :b => :until
注意点
self.hogehogeが使えなくて、どうやって値を取るのかかなり探してしまった…… バリデーションのファイル名は必ず「なんとかかんとか_validator」にしなければなりません。validatorついてなかったら読み込んでくれなかった。クラス名とファイル名も一致してないとだめだった。 たくさんのバリデーションを一つのファイルに書く方法はあるのかな?謎。 でも一回やり方わかってしまえば、シンプルに書けて使い回しできるのでとても便利 Rails2.xの時にはかなりぐちゃぐちゃになりがちだったので、コードがすっきりしてうれしい Rails3でjQueryを使う
2011.02.22 Tuesday
WEB+DB Pressを参考にしつつ… railsでjqueryを使うには、jquery-ujsというプラグインを使えばいいみたいです。 jquery-ujs: https://github.com/rails/jquery-ujs ほとんどgitに書いてあるまんまですが以下手順。 gem 'jquery-rails', '>= 0.2.6'
bundle install
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 に移行するよ Win7 64bitの場合Rails3と一緒に結局現状どのRubyを使えばいいのか(2011年2月版)
2011.02.05 Saturday
Rails3に移行しようと思ってインストールしたとき、Windowsであるせいでひっかかる箇所もちょいちょいありますが、それより何よりトラブルのもとは64bit!
64bitでさえなければ起こらなかった問題がどれだけたくさんあったことか
RubyとRailsを入れて、サンプルプログラムを動かそうとするのに、解決不能なエラーに多数ひかかってどうしてもうまくいかなくて、結局rubyとrailsいろんなバージョンの組み合わせを試すはめになりました……。
64bitのWindows機でトラブってここに辿り着く人がどれだけいるかわかりませんが、まあ誰か助けられれば幸いということで。
あまり気にしてなかったけど1.8.7の時も実はx32版でやっていたので、あとはこの1.9.2 x32でうまくいってくれるといいんだけど……。 |
Rails3レシピブック 190の技
ついにRails3対応版が出ました!!
WEB+DB PRESS Vol.58
Rails2系から3への移行時に知りたいことがひとまとまりになっててよかった!色々ググるよりこれを読む方が早い。
Rubyレシピブック 第3版 303の技
Rubyやるならこのリファレンスは必要。
Search this site
|