RoR:超级和次级分类控制器

时间:2011-08-09 14:56:51

标签: ruby-on-rails ruby polymorphism subclass superclass

所以..我在超级控制器中有一个与子控制器中的方法相同的方法..除了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 个答案:

答案 0 :(得分:1)

通常的“面向对象”方法是创建一个方法,两者都可以调用,然后在每个方法中以不同方式定义它:

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

这个想法是允许子类只重新定义它们所需的功能部分。这就是为什么你经常会看到特定的功能被分解为函数,即使他们所做的事情并不是特别复杂。

答案 1 :(得分:1)

你在超级和子类中都有redirect_to吗?在这种情况下,您可能需要使用标志(如会话变量)来决定是否在超类中使用或跳过redirect_to。

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