开发者

Is there a "rails way" to retry a POST after authenticating a user?

开发者 https://www.devze.com 2023-02-18 16:51 出处:网络
My user experience involves users submitting a form before they\'ve authenticated (using omniauth). I started doing something like this:

My user experience involves users submitting a form before they've authenticated (using omniauth). I started doing something like this:

    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

Then, on hitting the auth callback, redirect to a page that submits a form with the post params inline, for a total of 3 redirects (/stuff/new/ on POST -> auth/facebook -> facebook -> /auth/facebook/callback [ html template with POST form ] -> /stuff/crea开发者_开发技巧te). I'd rather not create an authentication popup; instead, I'd like to navigate to a separate page, log in, and redirect to the completed action.

I'm fairly new to Rails, so I'm still learning - is this already built in to another framework? Am I missing something really basic? Thanks in advance!


if you are asking as to whether or not there is a "RAILS" way that will automatically post the data after a redirect, the answer is no (see https://stackoverflow.com/questions/985596/redirect-to-using-post-in-rails)

In my opinion the safest, easiest, and most RESTful way to achieve what you want would be to simply have the params you are eventually posting stored in session so that you can redirect back to the original 'new' page and have the form automatically prefilled with the post data. Sure this is one extra step for the user, but since REST doesn't allow for redirects to POSTs it is imo the cleanest way to go about it


There may be a better way, but if you render this after authenticating, then the client will Ajax post the form contents then redirect.

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号