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

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

posted by スポンサードリンク | | - | - | - |はてなブックマーク - スポンサーサイト
sendgridのメールがgmailでスパム扱いされる
今公開してるRailsプロジェクトでは送信メールにGmailを使っているのだけれど、1日の送信件数が限界を超えそうなのでSendgridに移行するつもりでした。

なんだかんだ設定もすませてdevelopment環境で送信テストしたら……送信できたはずなのにメールが届かない(-_-;
おかしいと思って迷惑メールフォルダを見たら、案の定スパム扱いにされてました……。

調べてみると、どうやらGmailでだけスパム扱いされるという問題がある模様↓

それ、すっごく困るんですが。。。使えないじゃん(-_-;
他をあたるしかないか……。

posted by トモト | 00:08 | メール送信 | comments(0) | trackbacks(0) |はてなブックマーク - sendgridのメールがgmailでスパム扱いされる
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環境を整える
Heroku postgresの情報確認と接続・バックアップ/リストア

特定のテーブルのカラム型一覧を参照する

heroku pg:psql ←psqlに接続
¥d TABLE_NAME TABLE_NAMEで指定したテーブルのカラム一覧を表示
参考:
Class: Heroku::Command::Pg
テーブル定義の確認

pgAdmin靴Heroku postgresに接続、バックアップ/リストア

Heroku postgresのバックアップ、リストアの方法はここに書いてあるとおりなのだけれど、ローカルのdumpファイルをawsに上げてインポートしようとしたもののThe backup url is invalidとエラーが出て、それがどうしても解決できなかったのでpgAdmin靴Herokuのpostgresサーバーに接続してリストアしてみることに。


pgAdmin靴Heroku postgreSQLに接続する方法は以下を参照。
Connect PGAdmin3 to Heroku PostgreSQL dedicated database

バックアップ側のデータベースのところで右クリックして「バックアップ」を選択、フォーマットをTar、エンコードをUTF8にしてhogehoge.backupをどこかに保存。
リストア側のデータベースで右クリックして「リストアー」を選択、フォーマットをCustom or Tarにして上で保存したhogehoge,backupをリストア。
できた!楽しい
posted by トモト | 01:02 | Heroku | comments(0) | trackbacks(0) |はてなブックマーク - Heroku postgresの情報確認と接続・バックアップ/リストア
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にアップデートした時に引っかかったところ
Heroku postgresのデータをバックアップ・ローカルでリストア
Heroku db:pullがうまく動かなくなったので、Heroku postgresでバックアップ取ってリストアとかいうのをしなきゃいけなくなったのでメモ。
SQL知識ゼロ\(^∀^)/ちなみにWindowsです。

1 Heroku appのpostgresのところでsnapshotsの「+」をポチります。
***.dumpというファイルができるのでダウンロード。

2 コマンドプロンプトで、pg_restoreというのをやる。
Herokuの公式のここのページのExportを参照。
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump
青字部分を書き換えて実行すればリストアできます。

おわり。
posted by トモト | 00:21 | Heroku | comments(0) | trackbacks(0) |はてなブックマーク - Heroku postgresのデータをバックアップ・ローカルでリストア
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(0) |はてなブックマーク - 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レシピブック 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