RoR: контроллеры класса Super и Sub - PullRequest
0 голосов
/ 09 августа 2011

Итак ... у меня есть метод в суперконтроллере, такой же, как и в субконтроллере ... все, кроме redirect_to, если элемент не сохраняется ..

метод подкласса:

def create
some logic
respond_to do |format|
      if @template_object.save
        format.html { redirect_to({:controller=>:template_objects,:action=>:build,:id=>@template_object}) }
..
end

супер метод:

def create
some logic
respond_to do |format|
      if @template_object.save
        format.html { redirect_to({:controller=>:objects,:action=>:build,:id=>@object}) }
..
end

как лучше всего это сделать?

Ответы [ 2 ]

1 голос
/ 09 августа 2011

У вас есть redirect_to как в суперклассе, так и в подклассе?В этом случае вам может потребоваться использовать флаг, например переменную сеанса, чтобы решить, использовать ли или пропустить redirect_to в суперклассе.

Devise использует похожую технику, например, когда нам нужно redirect_to aопределенная страница после входа в систему с помощью устройства devise.

ваш суперкласс

def method
   ...some logic...
   if !session[:redirect_var].nil?
      session.delete :redirect_var
      redirect_to ....
   end 
end

ваш подкласс

def method
   session[:redirect_var] = 'skip_redirect' # or whatever, just create a session variable to use as a flag
   super
   ...some method...
   redirect_to ....
end
1 голос
/ 09 августа 2011

Обычный «объектно-ориентированный» подход к этому состоит в создании метода, который оба могут вызывать, а затем определять его по-разному в каждом из них:

def redirect_to_completed_template(template_object)
  redirect_to(...)
end

Идея состоит в том, чтобы подклассы моглиПереопределите только ту часть функциональности, которая им требуется.Вот почему вы часто будете видеть отдельные функции как функции, даже если то, что они делают, не особенно сложно.

...