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