0

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構築時にモデルを初期化するのに役立つだけのようですが、過去のバージョンでは、保存時に設定した他の値を上書きしていました。

実際のアプリケーションでは、使用するスコープの決定は、ユーザーの権限によって異なります。

マップをコントローラーから渡す前にクリーンアップできることはわかっていますが、その結果、ビジネス ロジックがコントローラーに入れられるようです。

では、この種の現在のユーザーに依存するビジネス ロジックを処理する適切な方法はあるのでしょうか?

4

0 に答える 0