2010-04-17 86 views
1

我试图根据由ActionController before_filter确定的某些条件来设置默认范围。在控制器:根据某些条件设置default_scope

before_filter :authorize 
    ... 
    def authorize 
    if some_condition 
     @default_scope_conditions = something 
    elsif another_condition 
     @default_scope_conditions = something_else 
    end 
    end 

里面的ActiveRecord的

default_scope :conditions => @default_scope_conditions 

但它似乎没有工作,在过滤器之前被调用,但default_scope不被设置。你能否告诉我我做错了什么,如何解决这个问题,或者建议我采取其他方式来实现这一目标。

+1

你设置@default_scope_conditions - 这是一个实例变量从** **控制器和你期望从**模型**中读取它。除非作为方法参数传递,否则从模型中不可见。 – 2010-04-17 10:00:43

回答

1

您设置@default_scope_conditions - 这是从控制器一个实例变量,你希望从模型阅读。除非作为方法参数传递,否则从模型中不可见。另外,这种方法会打破将模型逻辑与控制器逻辑分开的MVC原理:您的模型不应该自动访问有关控制器当前状态的信息。

你可以做些什么:使用匿名范围。

def scope_user 
    if some_condition 
     @default_scope_conditions = something 
    elsif another_condition 
     @default_scope_conditions = something_else 
    end 

    @user_scoped = User.scoped(:conditions => @default_scope_conditions) 
    end 

然后,在你的方法,你可以:

def my_method 
    users = @user_scoped.all 
end 

def my_method 
    User.with_scope(:conditions => @default_scope_conditions) do 
    # .. 
    @users = User.all #users get scoped 
    @products.users # also gets scoped 
    end 
end 
-1

尝试一个default_scope并使用custome finder覆盖它。

默认选项始终可以使用自定义查找器覆盖。

class User < ActiveRecord::Base 
    default_scope :order => '`users`.name asc' 
end 

User.all#将使用默认范围 User.all(:为了=> '名称降序')#将使用顺序选项传递。

那么你可以尝试像下面

before_filter :authorize 
    ... 
    def authorize 
    if some_condition 
     @order = '' # default scope 
    elsif another_condition 
     @order = something_else 
    end 
    end 

    def method_name 
    User.all(:order => @order) 
    end 

否检查虽然。

+0

只是好奇这有什么不对,让我知道吗? – Salil 2010-04-17 10:51:04