RSpecでredirectするとヘッダーの設定が無視される

Rails4 + RSpec3 のrequests specでredirect後の処理を検証したい時、以下コードのようにheaders部分にIPアドレスを指定しても無視されてしまう。(ちなみにCapybaraだとセッションの検査ができなかったのでできればrspecで検査したいという状況だった)

before do
  params = {}
  headers = { 'REMOTE_ADDR' => '192.168.0.1' }
  get_via_redirect photos_url, params, headers
end

解決方法の結論

実際にIPアドレスを取得するのに使っているメソッド、例えばActionDispatch::Request#remote_ip にmockを設定すればよい。

before do
  params = {}

  allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return('192.168.0.1')

  get_via_redirect photos_url, params, headers
end

調べた

どう考えてもリダイレクト先でヘッダーの指定が無視されているので、コードを追ってみた

続きを読む RSpecでredirectするとヘッダーの設定が無視される

Mongoidでdependentが無視される

Mongoidでdependentが無視される時、primary_keyが片方だけ指定されていて検索に失敗している場合がある

以下の擬似コードのような状況で動かないなーって思ったら、

class User
  include Mongoid::Document
  field :user_id, type: String
  has_many :pictures, dependent: :destroy
end

class Picture
  include Mongoid::Document
  belongs_to :user, primary_key: :user_id
end

has_many側にprimary_keyを付け忘れていた

class User
  include Mongoid::Document
  field :user_id, type: String
  has_many :pictures, primary_key: :user_id, dependent: :destroy
end

class Picture
  include Mongoid::Document
  belongs_to :user, primary_key: :user_id
end

sendgrid-rubyでカテゴリを設定する

https://sendgrid.com/docs/API_Reference/SMTP_API/categories.htmlが、https://github.com/sendgrid/sendgrid-rubyというgemライブラリで実際にカテゴリを設定する方法がよく分からなかった。

中のコードを読んだりググったりしてるうちに、以下のやり方で送信できることが確認できたのでメモ

client = SendGrid::Client.new(api_key: '0ACkvN4O3jUPEM8HzUAKdvQ7PT1NlGXlIX1jS0x7Gc1wo2ggx07Pd1tllkzUI4mayeRPP')
template = SendGrid::Template.new('aabbccdd-aaaa-bbbb-cccc-ddddeeeeffff')

recipient = SendGrid::Recipient.new('some-user@example.com')
recipients = [recipient]


# ここでX-SMTPAPIヘッダーに相当するデータを構築する
header = Smtpapi::Header.new
header.add_category('My Category No123')

mail_defaults = {
  from: 'noreply@example.com',
  from_name: 'Official',
}
mailer = SendGrid::TemplateMailer.new(client, template, recipients)
mailer.mail(mail_defaults)

続きを読む sendgrid-rubyでカテゴリを設定する

ngrok: localhostにドメインを割り当てる

ローカルで開発しているWebサービスに、どうしても外部サービスからアクセスさせたい時がある。例えばtwitterやfacebookで共有した時にどのような見た目になるか、を検証する時などはhttp://localhost:3000/を共有するわけにもいかない。

そんな時はngrokを使うと、超便利。ngrokをインストールしたら、以下のようにするだけでhttpアクセスを3000番ポートに飛ばすプロキシサーバーが生成される。

$ ngrok http 3000
ngrok by @inconshreveable                                                                                      (Ctrl+C to quit)

Tunnel Status                 online
Version                       2.0.19/2.0.19
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://7c7*****.ngrok.io -> localhost:3000
Forwarding                    https://7c7*****.ngrok.io -> localhost:3000

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

超便利!!

OSXでmongodした時にDBアクセスが異常に遅い

新しくMacBookProを買い換えてキャピキャピしながらコーディングしていると、前のMacで作ったRailsアプリの動作が異常に重い。

$ mongod を実行後に出力されているログを見ると、以下のような警告が出力されていた。

2015-08-00T00:00:00.000+0900 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000

これの解決方法について。

続きを読む OSXでmongodした時にDBアクセスが異常に遅い

新しく作ったRailsプロジェクトでRubyMineのNavigate to Decalareに失敗する

新しくRailsプロジェクトを作った時にEventLogに以下のようなメッセージが出てNavigate to Declareを筆頭にいくつかの機能が動かないことがあった

16:10:04 RubyMine Gem Manager
         RubyMine has detected that
         some of the gems required for 'my-project'
         are not installed
         Install missing gems
         (show balloon)
/usr/bin/ruby -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) /Users/akiroom/my-project/bin/bundle install
Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from https://rubygems.org/..
sudo: no tty present and no askpass program specified

Bundler::GemspecError: Could not read gem at /Library/Ruby/Gems/2.0.0/cache/rake-10.4.2.gem. It may be corrupted.
An error occurred while installing rake (10.4.2), and Bundler cannot continue.
Make sure that `gem install rake -v '10.4.2'` succeeds before bundling.

Process finished with exit code 5

rake 10.4.2はインストール済みなのでさっぱり分からず。


なんだろうと思ったら、rvmの影響で/usr/bin/rubyとrubyの指す場所が違っていた

% /usr/bin/ruby -v
ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin13]
% ruby -v
ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-darwin13.0]
% which ruby
/Users/akiroom/.rvm/rubies/ruby-2.1.4/bin/ruby

ので、Railsプロジェクトの直下に以下のファイルを置いて対応した

.ruby-version

ruby-2.1.4

利用目的からRubygemsを逆引きできるリファレンスThe Ruby Toolboxが便利

ちょっとしたスクリプトを書いている時とかRuby on Railsでアプリ開発してる時に、「画像処理がしたい」とか「Wiki機能をつけたい」とか色々悩んだらこのサイトを見るのが便利

https://www.ruby-toolbox.com/