ajaxformsruby-on-rails-4current-page

RAILS 4: Trying to get the current page to pass to render in an AJAX request


I have a fairly straight forward question.

On my site, within the header is a "invite a colleague" link to a modal that contains a form:

    <%= simple_form_for(current_user, :url => send_invite_user_path(current_user), remote: true) do |f| %>
        <%= f.label :email %><br>
        <%= f.text_field :email, class: 'form-control' %>
        <%= f.submit "Send", class: "btn btn-primary ShareSend" %>
    <% end %>

Here is the send invite controller

 def send_invite
   @current_page = URI(request.referer).path
   @email = params[:user][:email]
   InviteWorker.perform_async(current_user.id, @email)
   respond_to do |format|
      flash.now[:success] = "Invite sent"
      format.html { redirect_to @current_page, :current_page => @current_page}
      format.js { render @current_page}
    end
  end

It works fine when not using AJAX, but I want to try to get it to work via AJAX. The issue is that the "current_page" when I open the modal and try to send via AJAX refers to the "send_invite" action and is looking for a "send_invite" template. I want it to render WHATEVER page the user is on. To add to my difficulty I am using friendly_id.....I tried using

   @page_hash = Rails.application.routes.recognize_path(URI(request.referer).path)

To try to extract the user action from the current page path, but obviously this doesn't work with friendly id.

Is there a "Rails way" of capturing the current page (ignoring the modal) and passing this to render....

I hope this is clear...


Solution

  • An AJAX call does not trigger a complete reload of the current page (unless explicitly told to). The request is handled in the background by javascript.

    In your case you should add a view called send_invite.js.erb (i guess in your app/views/users folder - assuming that send_invite belongs to UsersController) that has some javascript that notifies the user of a successful invite and closes the modal. This view could be as simple as:

    alert("Invite sent!");window.closeMyInviteModal();
    

    This script will be executed if (and each time) the AJAX call succeed.

    Clean the js responder in send_invite. This will by default render the send_invite.js view.

         format.js { }
    

    See http://guides.rubyonrails.org/working_with_javascript_in_rails.html#a-simple-example