Frage

Ich versuche, Satz Standardbereich nach einigen festgelegten Kriterien von ana Action before_filter. Im Controller:

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

Im Innern des Active

default_scope :conditions => @default_scope_conditions

Aber es scheint nicht zu arbeiten, werden die vor-Filter genannt, aber die default_scope nicht gesetzt bekommen. Könnten Sie mir bitte raten, was ich falsch mache und wie man es beheben oder empfehlen Sie mir eine andere Art und Weise, dies zu erreichen.

War es hilfreich?

Lösung

Sie setzen @default_scope_conditions - das ist eine Instanz-Variable aus dem Controller und Sie erwarten, dass es aus dem Modell lesen . Es ist nicht sichtbar aus dem Modell, es sei denn als Methodenparameter übergeben.

Mehr, dieser Ansatz würde das MVC-Prinzip durchbrechen, die die Modelllogik von der Steuerungslogik trennt. Ihr Modell sollte nicht automatisch Zugriff Informationen über den aktuellen Zustand des Controllers

Was Sie tun können: verwenden anonyme Bereiche

.
  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

Dann in Ihrer Methode können Sie:

def my_method
  users = @user_scoped.all
end

oder

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

Andere Tipps

Versuchen Sie eine default_scope und außer Kraft setzen es custome Finder verwendet wird.

Die Standardoptionen können immer einen benutzerdefinierten finder außer Kraft gesetzt werden.

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

User.all # wird Standardbereich verwenden User.all. (: Order => 'name desc') # wird in der Reihenfolge Option übergeben verwenden

Dann können Sie versuchen, so etwas wie folgt

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

Nein Prüfen though.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top