Rails 3.0 で正常に動作していた Rails 3.2 に更新しようとしているアプリケーションではwith_scope
、ユーザーの権限に応じてモデルのユーザー固有の操作を適用するために使用するスコープ規則がいくつかあります。
自明なモデル:
class Item < ActiveRecord::Base
attr_accessible :value
end
スコープの動作のテスト:
require 'test_helper'
class ItemTest < ActiveSupport::TestCase
test "scoping for create" do
Item.with_scope({ :create => { :value => 42 }}) do
item = Item.create!
assert_equal 42, item.value
end
end
test "scoping for create when caller tries to override" do
Item.with_scope({ :create => { :value => 42 }}) do
item = Item.create!(:value => 37)
assert_equal 42, item.value
end
end
test "scoping for update" do
Item.with_scope({ :create => { :value => 42 }}) do
item = Item.create!
item.update_attributes!(:value => 37)
assert_equal 42, item.value
end
end
end
Rails 3.2 では、「作成のスコープ」はパスし、他の 2 つは失敗します。Rails 3.2 (おそらく 3.1 でも同様です) では、:create
構築時にモデルを初期化するのに役立つだけのようですが、過去のバージョンでは、保存時に設定した他の値を上書きしていました。
実際のアプリケーションでは、使用するスコープの決定は、ユーザーの権限によって異なります。
マップをコントローラーから渡す前にクリーンアップできることはわかっていますが、その結果、ビジネス ロジックがコントローラーに入れられるようです。
では、この種の現在のユーザーに依存するビジネス ロジックを処理する適切な方法はあるのでしょうか?