2011-03-18 22 views
2

我的用户体验涉及用户在验证之前提交表单(使用omniauth)。我开始做这样的事情:在验证用户身份之后,是否有“导轨方式”重试POST?

def self.require_facebook_authentication!(options={}) 
     before_filter :redirect_to_facebook_if_not_authenticated options 
    end 

    def redirect_to_facebook_if_not_authenticated 
     if !logged_in? 
     session[:param_cache] = params 
     session[:original_destination] = request.fullpath 
     redirect_to '/auth/facebook' 

     end 
    end 

然后,在碰到AUTH回调,重定向到提交形式与post数据内嵌,共3个重定向(/stuff/new/ on POST -> auth/facebook -> facebook -> /auth/facebook/callback [ html template with POST form ] -> /stuff/create)的页面。我宁愿不创建身份验证弹出窗口;相反,我想导航到一个单独的页面,登录并重定向到已完成的操作。

我对Rails相当陌生,所以我仍然在学习 - 这是否已经内置于另一个框架?我错过了一些非常基本的东西?提前致谢!

回答

4

如果你问,以是否有一个“导轨”的方式重定向后,它会自动上传数据,答案是否定的(见https://stackoverflow.com/questions/985596/redirect-to-using-post-in-rails)

在我看来是最安全的,最简单,最RESTful的方式来实现你想要的只是简单地将你最终发布的参数存储在会话中,以便你可以重定向到原来的'新'页面并使表单自动预填充发布数据。这对于用户来说是一个额外的步骤,但是由于REST不允许重定向到POST,所以它是最简单的方式去处理它

0

可能有更好的方法,但是如果你在认证后渲染这个,那么客户端会把Ajax发布到表单内容然后重定向。

<script> 
    new Ajax.Request(<%= session[:original_destination] %>, { 
    method: 'post', 
    params: '<%= session[:param_cache].to_query %>', 
    onSuccess: function(){ 
     window.location = '<%= session[:original_destination] %>'; 
    } 
    }); 
</script> 
+0

不会尝试去两次original_destination吗? (一旦POST数据,然后再次没有?) – 2011-03-18 04:28:29

+0

@Anthony Bishopric:是的。您希望捕获并更改window.location调用,以便在成功发布后将用户发送到的位置。 – Unixmonkey 2011-03-18 13:23:26