Rails4でsporkがエラー

$ spork
Using RSpec
Preloading Rails environment
uninitialized constant ActiveModel::Observing (NameError)
/Users/rochefort/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/spork-0.9.2/lib/spork/app_framework/rails.rb:56:in `preload_rails'
/Users/rochefort/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/spork-0.9.2/lib/spork/app_framework/rails.rb:7:in `preload'
/Users/rochefort/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/spork-0.9.2/lib/spork/test_framework.rb:134:in `block in preload'
/Users/rochefort/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/spork-0.9.2/lib/spork.rb:62:in `exec_prefork'
/Users/rochefort/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/spork-0.9.2/lib/spork/test_framework.rb:120:in `preload'
/Users/rochefort/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/spork-0.9.2/lib/spork/run_strategy/forking.rb:25:in `preload'
/Users/rochefort/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/spork-0.9.2/lib/spork/runner.rb:74:in `run'
/Users/rochefort/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/spork-0.9.2/lib/spork/runner.rb:10:in `run'
/Users/rochefort/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/spork-0.9.2/bin/spork:10:in `<top (required)>'
/Users/rochefort/.rbenv/versions/2.0.0-p0/bin/spork:23:in `load'
/Users/rochefort/.rbenv/versions/2.0.0-p0/bin/spork:23:in `<main>'

sporkするとエラー。
とりあえず、ぐぐってみると
Rails 4 support · Issue #223 · sporkrb/spork

が出てきましたが、同様のことをやっても解決しません。
 
ふとgem search spork --pre してみると
1.0.0rc3 が存在したので、Gemfileで同バージョンを指定してinstallするとうまく稼働しました。
原因は、ActiveModel::Observing が別gemになったからだと思うのですが
1.0.0rc3のソースを見るとrails.rbのソースが無くなってます。
version.txtをみると1.0.0rc0で対応したっぽいです。

Rails4でrails-footnotesがエラーになる

久しぶりにrails-footnotesをRails4で実行してみたら
エラーとなった。

ActiveRecord::StatementInvalid

TypeError: nil is not a symbol: SELECT name FROM sqlite_master WHERE type = 'table' AND NOT name = 'sqlite_sequence' AND name = "schema_migrations"

調べてみたら、すでにpull requestが上がっていた。
取り込まれたら試してみよう。
rails-footnotes breaks Rails 4 application on boot by rrooding · Pull Request #90 · josevalim/rails-footnotes

github見てみると色々変わってそうだ。
そもそもこれ、josevalimさんの作品だったのか。

参考

josevalim/rails-footnotes · GitHub
rails footnotes - rochefort's blog

Rails4のMass Assignment対策


Riding Rails: Strong parameters: Dealing with mass assignment in the controller instead of the model


Rails4のMass Assignment対策としてStrong parametersを利用するとのこと。(既にgem化されている)


google readerが新しいfeedを取ってきてくれてないので
全然気づいてませんでした。
(padrino使ってたら、activesupport3.2.3が入って驚いた)

Strong parameters

rails/strong_parameters

parameterをsliceして使うこともあるから
model側でなくcontroll側で制御する。


sampleが分かりやすいんだけど、
person_paramsなかで許可するパラメータを設定している。

class PeopleController < ActionController::Base
  # This will raise an ActiveModel::ForbiddenAttributes exception because it's using mass assignment
  # without an explicit permit step.
  def create
    Person.create(params[:person])
  end

  # This will pass with flying colors as long as there's a person key in the parameters, otherwise
  # it'll raise a ActionController::MissingParameter exception, which will get caught by 
  # ActionController::Base and turned into that 400 Bad Request reply.
  def update
    redirect_to current_account.people.find(params[:id]).tap do |person|
      person.update_attributes!(person_params)
    end
  end

  private
    # Using a private method to encapsulate the permissible parameters is just a good pattern
    # since you'll be able to reuse the same permit list between create and update. Also, you
    # can specialize this method with per-user checking of permissible attributes.
    def person_params
      params.require(:person).permit(:name, :age)
    end
end

More work to be done

nested parametersの実装がまだなのと、
Yehudaさんが標準的なformの場合、自動的に設定するような仕組みを作ろうとしてくれてるっぽい。