RSPECでtransactionのエラーがでる

RSPECでテストをしようとしたらエラーが出ました(☝ ՞ਊ ՞)

active_recordが存在しないエラーが発生

rspecを実行します。sporkを使っているのでdrbオプションをつけています。

bundle exec rspec --drb spec/requests/

Failure/Error: Unable to find matching line from backtrace
ActiveRecord::StatementInvalid:
Mysql2::Error: SAVEPOINT active_record_1 does not exist: ROLLBACK TO SAVEPOINT active_record_1

よくわからないエラーがでました:(;゙゚’ω゚’):

transaction_fixturesを変更する

spec_helperのtransaction_fixturesをtrueからfalseに変更します。

vi spec/spec_helper.rb
config.use_transactional_fixtures = false

# DatabaseCleaner
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
end

ついでにDatabaseCleanerの設定に:transactionを指定しました。

動作確認

動作テストをしました。

bundle exec rspec --drb spec/requests/

………

Finished in 2.09 seconds
9 examples, 0 failures

Randomized with seed 58262

動いたヤッタネ(☝ ՞ਊ ՞)

参考:https://relishapp.com/rspec/rspec-rails/docs/transactions

herokuにデプロイしたのにActionController::RoutingError (No route matches [GET] “/”):とエラーがでる

Herokuにデプロイしようとしたところ、エラーで苦労しました(☝ ՞ਊ ՞)

herokuへデプロイ

herokuへ変更をpushします。

git push heroku master
Fetching repository, done.
Everything up-to-date

ブラウザを開きます。

heroku open
Opening aqueous-caverns-5124… done

エラーがでます。

The page you were looking for doesn’t exist. You may have mistyped the address or the page may have moved.

なにこれ:(;゙゚’ω゚’):

heroku logsでherokuのログを表示する

herokuのログを表示します。

heroku logs –tail

これでherokuのログが流れるようになったので、その状態でブラウザからアクセスするとログを確認できます。

RoutingErrorが発生

ログを表示したところRoutingエラーが発生していることがわかりました。

ActionController::RoutingError (No route matches [GET] “/”):

config/routes.rbにrootを追加

ルートを追加します。

vi config/routes.rb
root “huga#home”

hugaコントローラのhomeアクションを追加しました。git addとgit commitをしてherokuにデプロイします。

git push heroku master
Fetching repository, done.
Everything up-to-date

おかしいです。Everything up-to-dateと表示されました。

pushするブランチを間違えていた

変更をしてpushしたのに差分がデプロイされていません。branchを確認します。

git branch
master
* static-pages

どうやらmasterブランチがpushできていなかったようです。

branchをmasterに変更します。

git checkout master
M .idea/workspace.xml
Switched to branch ‘master’

branchを確認します。

git branch
* master
static-pages

masterブランチに変更されました。

branchをmergeしてpush

いままでstatic-pagesブランチで開発していたのでmasterにmergeします。

git merge static-pages
Updating ac94da5..578b404
Fast-forward
app/assets/javascripts/static_pages.js.coffee | 3 +
app/assets/stylesheets/static_pages.css.scss

mergeされました。

masterをherokuにpushします。

git push heroku master
Fetching repository, done.
Counting objects: 57, done.
Delta compression using up to 8 threads.

To git@heroku.com:aqueous-caverns-5124.git
ac94da5..578b404 master -> master

herokuにpushされました。

動作確認

ブラウザを開きます。

heroku open

やっと変更が表示されました(☝ ՞ਊ ՞)

やったね(☝ ՞ਊ ՞)☝

rspecを実行した時にuninitialized constant Capybara (NameError)というエラーがでる

railstutorialのspecの実行でエラーがでました(☝ ՞ਊ ՞)

Capybaraが無いとエラーがでる

rspecコマンドを実行します。

bundle exec rspec spec/requests/static_pages_spec.rb
/var/www/html/rails/railstutorial2/spec/spec_helper.rb:46:in `block in ‘: uninitialized constant Capybara (NameError)
from /home/vagrant/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rspec-core-2.13.1/lib/rspec/core.rb:107:in `configure’

エラーがでました。

該当の行はCapybara::DSLと書いている行です。

config.include Capybara::DSL

Capybaraが無いのですかね。

GemfileにCapybaraを追加

gem listを確認してからGemfileにcapybaraを追加します。

group :development, :test do
gem ‘sqlite3’, ‘1.3.8’
gem ‘rspec-rails’, ‘2.13.1’
gem ‘capybara’ # 追加
end

Gemfileを更新したのでbundle installをします。

動作確認

再びrspecのコマンドを実行します。

bundle exec rspec spec/requests/static_pages_spec.rb
F

Failures:

1) StaticPages Home page should have the content ‘Sample App’
Failure/Error: expect(page).to have_content(‘Sample App’)
expected #has_content?(“Sample App”) to return true, got false
# ./spec/requests/static_pages_spec.rb:9:in `block (3 levels) in

Finished in 0.13441 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/requests/static_pages_spec.rb:7 # StaticPages Home page should have the content ‘Sample App’

Randomized with seed 13050

おお!こんどはテストが失敗しました(☝ ՞ਊ ՞)capybaraが無いよっていうエラーで合っていたみたいです。

HerokuにpushしようとするとGemfile.lockを要求される

Herokuへのデプロイが失敗しました(☝ ՞ਊ ՞)

Herokuへのデプロイでエラーが

heroku create します。

heroku create
Enter your Heroku credentials.
Email: mail@pugiemonn.com
Password (typing will be hidden):

Creating aqueous-caverns-5124… done, stack is cedar
http://aqueous-caverns-5124.herokuapp.com/ | git@heroku.com:aqueous-caverns-5124.git
Git remote heroku added

herokuへpushします

git push heroku master
Initializing repository, done.
Counting objects: 94, done.
Compressing objects: 100% (80/80), done.
Writing objects: 100% (94/94), 155.71 KiB, done.
Total 94 (delta 12), reused 0 (delta 0)

—–> Ruby app detected
—–> Compiling Ruby/NoLockfile
!
! Gemfile.lock required. Please check it in.

To git@heroku.com:aqueous-caverns-5124.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to ‘git@heroku.com:aqueous-caverns-5124.git’

エラーがでました:(;゙゚’ω゚’):

Gemfile.lockが必要だとか書いてあります。

Gemfile.lockを追加

Gemfile.lockを追加です。

git add Gemfile.lock
git commit -m “add Gemfile.lock”
[master ac94da5] add Gemfile.lock
1 file changed, 146 insertions(+)
create mode 100644 Gemfile.lock

とりあえず追加しました。

動作確認

もう一度pushを試します。

git push heroku master
Initializing repository, done.
Counting objects: 97, done.
Compressing objects: 100% (83/83), done.
Writing objects: 100% (97/97), 156.93 KiB, done.
Total 97 (delta 13), reused 0 (delta 0)

To git@heroku.com:aqueous-caverns-5124.git
* [new branch] master -> master

成功したみたいです。やったね(☝ ՞ਊ ՞)

ssh-agent: Agent RuntimeError というエラーがでる。Macでvagrant起動時に

vagrantを起動しようとしてこけました(☝ ՞ਊ ՞)

ssh-agent: Agent RuntimeErrorが発生

vagrant upしようとするとエラーが出ます。

vagrant up

[default] Configuring and enabling network interfaces…
/Applications/Vagrant/embedded/gems/gems/net-scp-1.1.2/lib/net/scp.rb:392:in `await_response_state’: ssh-agent: Agent pid 1733 (RuntimeError)
from /Applications/Vagrant/embedded/gems/gems/net-scp-1.1.2/lib/net/scp.rb:363:in `block (3 levels) in start_command’
from /Applications/Vagrant/embedded/gems/gems/net-ssh-2.6.8/lib/net/ssh/connection/channel.rb:311:in `call’
from /Applications/Vagrant/embedded/gems/gems/net-ssh-2.6.8/lib/net/ssh/connection/channel.rb:311:in `process’

なにこれ:(;゙゚’ω゚’):

どうやら似たような症状の方がいました。
Vagrant上のマシンにprivate_networkで定義したIPで接続できない
上記の症状と同じで、エラーは発生するもののVM自体は立ち上がっていてsshはできます。しかしネットワーク周りに問題があるようです。sshでログインしてもsynced_folderもつながらならなくなってしまいました(´・ω・`)

プライベートネットワークを無効に

プラベートネットワークを無効にします。

config.vm.network :private_network, ip: “192.168.33.10”

応急処置でネットワークを無効にしました。

動作確認

vagrantを再起動します。

vagrant reload
[default] Attempting graceful shutdown of VM…
[default] Clearing any previously set forwarded ports…
[default] Creating shared folders metadata…
[default] Clearing any previously set network interfaces…
[default] Preparing network interfaces based on configuration…
[default] Forwarding ports…
[default] — 22 => 2222 (adapter 1)
[default] — 3000 => 3333 (adapter 1)
[default] Running ‘pre-boot’ VM customizations…
[default] Booting VM…
[default] Waiting for machine to boot. This may take a few minutes…
[default] Machine booted and ready!
[default] The guest additions on this VM do not match the installed version of
VirtualBox! In most cases this is fine, but in rare cases it can
cause things such as shared folders to not work properly. If you see
shared folder errors, please update the guest additions within the
virtual machine and reload your VM.

Guest Additions Version: 4.2.16
VirtualBox Version: 4.3
[default] Mounting shared folders…
[default] — /vagrant
[default] — /var/www/html

起動できました。よかったよかった(☝ ՞ਊ ՞)

Could not find a JavaScript runtime エラーがRails4でrails sしたときに発生する

rails sでrailsを起動しようとしたらエラーがでました(☝ ՞ਊ ՞)

Could not find a JavaScript runtime エラーが発生

rails s
/home/vagrant/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/execjs-2.0.2/lib/execjs/runtimes.rb:51:in `autodetect’: Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

うーむエラーがでました。

gemのtherubyracerを有効にする

Gemfileにtherubyracerの項目がコメントされているのでコメントを削除します。

gem ‘therubyracer’, platforms: :ruby

その後で、bundle installを実行してみます。

bundle install

これでgemをインストールされます。

動作確認

rails sで動作確認しました。

rails s -p 8080
=> Booting WEBrick
=> Rails 4.0.2 application starting in development on http://0.0.0.0:8080
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2014-01-18 07:18:09] INFO WEBrick 1.3.1
[2014-01-18 07:18:09] INFO ruby 2.0.0 (2013-06-27) [x86_64-linux]
[2014-01-18 07:18:09] INFO WEBrick::HTTPServer#start: pid=1966 port=8080

うまく起動できたみたいです(☝ ՞ਊ ՞)

CentOSでbundle installするとpgでコケる

bundle installしたらこけました(☝ ՞ਊ ՞)

pgのインストールで失敗

bundle installが失敗します。

Installing pg (0.15.1)
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

/home/vagrant/.rbenv/versions/2.0.0-p247/bin/ruby extconf.rb
checking for pg_config… no
No pg_config… trying anyway. If building fails, please try again with
–with-pg-config=/path/to/pg_config
checking for libpq-fe.h… no
Can’t find the ‘libpq-fe.h header
*** 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.

Gem files will remain installed in /home/vagrant/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pg-0.15.1 for inspection.
Results logged to /home/vagrant/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pg-0.15.1/ext/gem_make.out

An error occurred while installing pg (0.15.1), and Bundler cannot continue.
Make sure that `gem install pg -v ‘0.15.1’` succeeds before bundling.

pgのところで失敗します。

postgresql-libsをインストールする

CentOSでpostgresql-libsをインストールするといいみたいです。

sudo yum install postgresql-devel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: www.ftp.ne.jp
* extras: www.ftp.ne.jp

Installed:
postgresql-devel.x86_64 0:8.4.18-1.el6_4

Dependency Installed:
postgresql.x86_64 0:8.4.18-1.el6_4 postgresql-libs.x86_64 0:8.4.18-1.el6_4

Complete!

この後にbundle installしたらうまくいきました。

参考:http://serverfault.com/questions/316703/how-to-install-libpq-dev-on-centos-5-5

まとめ

CentOSでpgをいれるときはpostgresql-libsを入れるといいようです(☝ ՞ਊ ՞)☝

rubyでmapやselectで配列の中身を取り出す

rubyで配列中身を取得や判定するのにmapやselectを使うと便利でした。

配列を定義

mapやselectのテストを行うためにテスト用の配列を定義します。

a = {{id: 1, count: 2}, {id: 2, count: 10}}

配列内に、ハッシュが2つはいった配列を用意しました。

selectで配列の中身を検索する

selectを使って配列の中にあるキーがcount、値が2のハッシュを検索します。

a.select{|i| i[:count] == 2 }
=> [{:id=>1, :count=>2}]

ハッシュが入った配列が返りました。

mapで配列の中身を判定する

mapを使うと配列内の値に対して判定を記述することできます。キーがcount、値が2のハッシュを判定します。

a.map{|i| i[:count] == 2}
=> [true, false]

trueとfalseの判定結果が入った配列が返りました。

mapで帰った配列を判定する

trueとfalseが返ってきたので、中の配列にtrueが入っているかを調べます。

a.map{|i| i[:count] == 2}.include?(true)
=> true

includeを使ったところtrueが返りました。

まとめ

selectやmapを使うと配列の検索がかなり捗るようになりました。
ありがとうございます(☝ ՞ਊ ՞)