在验证用户身份后是否有“rails way”重试POST?

时间:2011-03-18 00:51:36

标签: ruby-on-rails authentication post routing

我的用户体验涉及用户在进行身份验证之前提交表单(使用omniauth)。我开始做这样的事情:

    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 params inline的表单的页面,总共有3个重定向(/stuff/new/ on POST -> auth/facebook -> facebook -> /auth/facebook/callback [ html template with POST form ] -> /stuff/create)。我宁愿不创建一个身份验证弹出窗口;相反,我想导航到一个单独的页面,登录并重定向到已完成的操作。

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

2 个答案:

答案 0 :(得分:4)

如果您询问是否有“RAILS”方式会在重定向后自动发布数据,则答案为否(请参阅https://stackoverflow.com/questions/985596/redirect-to-using-post-in-rails)

在我看来,最安全,最简单,最RESTful的方式来实现你想要的只是让你最终发布的params存储在session中,这样你就可以重定向回到原来的'new'页面并拥有表单自动预填充后期数据。当然这对于用户来说是一个额外的步骤,但由于REST不允许重定向到POST,因此它是最简洁的方法

答案 1 :(得分: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>