2011-04-04 82 views
28

使用omniauth宝石,我不得不定义一个路线回调成功的登录,无论提供者:扶手:渲染并立即退出

def auth_callback 

     auth_data = request.env['omniauth.auth'] 

     if auth_data.has_key('something') 
      process_one(auth_data) 
     else 
      process_two(auth_data) 
     end 

     # No view is available here 

end 


def process_one 
    # do something then render view for process_one 
    return 
end 

def process_two 
    # do something then render view for process_two 
    return 
end 

我怎样才能防止控制器返回auth_callback方法并尝试显示相应的视图(不存在)?一旦process_one或process_two方法返回,治疗应被视为完成。

+0

你在你的方法'process_one'和'process_two'中有没有返回代码路径吗?如果是的话,你可以尝试呈现:没什么=> true或别的东西有 – 2011-04-04 13:38:07

+0

我可以使用“如果(x)的渲染:process_one其他渲染:process_two”在auth_callback,但它是相当不自然:我宁愿依靠process_one和process_two表达自己的观点。 – 2011-04-04 13:46:57

+0

我的意思是如果你写了一个简单的'return'(或者像'return if(!something)'这样的代码)。轨道会尝试呈现默认动作视图 – 2011-04-04 13:53:51

回答

70

为什么不在这些方法中专门调用render

def process_one 
# do something then render view for process_one 
render :process_one and return 
end 

Rails应该检测到你已经运行它,而不是尝试再次渲染。

+0

作品。我认为即使已经调用了渲染,Rails也会尝试渲染auth_callback。非常感谢。 – 2011-04-04 13:53:38

+0

从控制器方法返回非常实用(不需要处理下面的代码,通常在一些验证之后)。 谢谢:) – lboix 2014-06-06 03:33:27

+0

由于渲染后没有任何逻辑,在这种情况下是否需要返回?换句话说,如果该方法不返回nil,而是返回任何'render',那么它可以吗? – Dennis 2014-11-05 20:51:01