Spreeでundefined method `states’ for nil:NilClassのエラーが発生

Ruby on Rails 4.1.8
Spree 2.6-stable
でECサイトを作っていて、カートに商品をいれて次へ進むとエラーが発生

NoMethodError in Spree::Checkout#edit
Showing /home/vagrant/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/spree-dcd415d3ea99/frontend/app/views/spree/address/_form.html.erb where line #38 raised:
undefined method `states' for nil:NilClass

spree_error

インストールしたばかりなのになぜ..と思ったら

https://github.com/spree/spree/issues/1142
で議論されてましたので参考に

$ rake db:seed

loading ruby /home/vagrant/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/spree-984ecbce1d91/core/db/default/spree/countries.rb
loading ruby /home/vagrant/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/spree-984ecbce1d91/core/db/default/spree/roles.rb
loading ruby /home/vagrant/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/spree-984ecbce1d91/core/db/default/spree/states.rb
loading ruby /home/vagrant/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/spree-984ecbce1d91/core/db/default/spree/stores.rb
loading ruby /home/vagrant/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/spree-984ecbce1d91/core/db/default/spree/zones.rb
loading ruby /home/vagrant/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/spree_auth_devise-0172d0450bef/db/default/users.rb
Admin user has already been previously created.
・・・

などとできあがる初期値を作ってやったら直りました

https://github.com/spree/spree/commit/9820b66bb8d11fc8826dbeead2c46bc1424b8efb
で直ったのかと思ったらだめみたいです

参考) Ruby on RailsにSpreeを入れてみた | bgbgbg

Gemfileのバージョンの指定の仕方

RubyのGemfilesへのバージョンの書き方を忘れるのでメモ

バージョンを4.1.8に固定する

gem "rails", "4.1.8"

バージョンを4.1.8以上の最新にする
4.2とか入ります

gem "rails", ">=4.1.8"

バージョンを4.1.8以上、4.1.xの最新が入ります
4.2以上にはなりません

gem "rails", "~>4.1.8"

Perfect Ruby 1章を読んでみた

RubyはRailsから入って、Rubyがわからずはまっている気がしたので

を買いました
1章を読んでみた気づきをメモ

Rubyではすべてがオブジェクトです

コードの出力をコメント # で書いてます

p 100.to_s
# "100"
p 100.class
# Fixnum

p nil
# nil
p nil.class
# NilClass

100とかnil(いわゆるnull)もクラスです
100はFixnumクラスなので、to_sとかメソッドを持っています

def sample_method
  'sample'
end
p sample_method
# "sample"

メソッドは は snake caseで書くのが一般的

def happy?
  true
end
p 'happy' if happy?
# "happy"

メソッドには ? もつけられる
bool値を返すメソッドとわかりやすい

sample_variable = 'sample'
p sample_variable
# "sample"

変数名はsnake case が一般的

1.upto(2) do |n|
  puts n
end
# 1
# 2

こんなのがブロックという

1.upto(2) {|n| puts n}
# 1
# 2

ブロックを一行で書くとこう

Ruby 面白いかも