提案ごとに、これを回答として分離することを保証するのに十分な詳細があります。
method_missing
実装の一部として定義するモデルまで問題を追跡しました。method_missing
モデルに定義がある場合、アクセサの代わりに呼び出されることがわかりました。これにより、モデルのセットアップが失敗します。
(私の特定のケースでは、method_missing が定義されており、これが最初に言及したスタック オーバーフローの原因です)。
Rails 3.2.14 で新しい Rails アプリを定義し、新しいモデルを作成することで、問題を簡潔に再現できます。
class Item < ActiveRecord::Base
attr_accessible :name, :content
store :content
def method_missing(id, *args)
puts "method missing: #{id}"
end
end
および関連する移行
class CreateItems < ActiveRecord::Migration
def change
create_table :items do |t|
t.string :name
t.text :content
t.timestamps
end
end
end
Rails コンソールを実行すると、モデルを実行できます。
$ rails console
Loading development environment (Rails 3.2.14)
2.0.0p247 :001 > x = Item.new(name: 'foo')
=> #<Item id: nil, name: "foo", content: {}, created_at: nil, updated_at: nil>
2.0.0p247 :002 >
Rails 4.0.0 でまったく同じものをビルドすると、異なる出力が得られます。
$ rails console
Loading development environment (Rails 4.0.0)
2.0.0p247 :001 > x = Item.new(name: 'foo')
method missing: name=
=> #<Item id: nil, name: nil, content: {}, created_at: nil, updated_at: nil>
2.0.0p247 :002 >
name
Rails 3.2.14 では、属性が意図どおりに設定されていることに気付くでしょうfoo
。ただし、Rails 4.0.0 では、method_missing
が呼び出され、属性が設定されていないことがわかります。
私は ActiveRecord への変更を読んでいますがmethod_missing
、Rails 4 より前に使用していたモデルが Rails 4 では使用できなくなることを示唆するものを見つけることができませんでした。
コード例を Rails 4 で動作させるためのヒントは、モデルで抱えている問題を解決するのに役立ちます。
アップデート
上向きのmethod_missing
チェーンを手動で呼び出すことにより、上記の例を機能させることができます。
def method_missing(id, *args)
super
if respond_to? id
send(id,*args)
else
puts "method missing: #{id}"
end
end
Rails 3 と 4 の間でこの動作が変更された理由が明確でないため、これを行う必要があることは私には間違っているように感じます。