在Rails应用程序中多个连续的AJAX调用

时间:2018-08-29 13:59:58

标签: ruby-on-rails ajax devise ruby-on-rails-5.1

我目前有一个应用,访问者可以使用devise通过AJAX表单进行注册。

我想增强此表单并执行以下操作:

  1. 当用户在页面上时,将显示带有订阅选项的模式。
  2. 他提交此表单后,将显示注册表单。
  3. 他填写并提交表格后,将显示付款表格(+所选订阅的摘要)。
  4. 用户付款后,便会被重定向。

因此,我一直在考虑进行三个连续的AJAX调用,但是我陷入了困境。

这是我第一部分所做的事情(从订阅选择表到注册表):

meals / index.html.erb:

<% if current_user == nil %>
  <%= render partial: 'subscriptions/subscription_selection' %>
<% end %>

subscriptions / _subscription_selection.html.erb:

<!-- some blabla -->
<%= form_tag save_subscription_choice_path, method: "get", remote: true do %>
          <%= hidden_field_tag 'chosen_subscription', '22'%>
          <%= submit_tag 'CHOISIR CETTE FORMULE', class: 'btn btn-primary' %>
        <% end %>

subscription_controller.rb:

  def save_subscription_choice
    @subscription_choice_id = params['chosen_subscription']
    respond_to do |format|
      format.js
    end
  end

config / routes.rb:

get "subscriptions/save_subscription_choice", to: "subscriptions#save_subscription_choice", as: "save_subscription_choice"

subscriptions / save_subscription_choice.js.erb:

$(".subscription-selection-modal").html("<%= escape_javascript(render partial: 'meals/signup_modal') %>");

console.log('save_subscription_choice.js.erb succesfully loaded');

,错误日志为:

Started GET "/subscriptions/save_subscription_choice?utf8=%E2%9C%93&chosen_subscription=12&commit=CHOISIR+CETTE+FORMULE" for 127.0.0.1 at 2018-08-29 15:48:04 +0200
Processing by SubscriptionsController#show as JS
  Parameters: {"utf8"=>"✓", "chosen_subscription"=>"12", "commit"=>"CHOISIR CETTE FORMULE", "id"=>"save_subscription_choice"}
Completed 401 Unauthorized in 1ms (ActiveRecord: 0.0ms)


Started GET "/users/sign_in.js" for 127.0.0.1 at 2018-08-29 15:48:04 +0200
Processing by Devise::SessionsController#new as JS
Completed 406 Not Acceptable in 1ms (ActiveRecord: 0.0ms)



ActionController::UnknownFormat (ActionController::UnknownFormat):

我不知道为什么该应用程序调用/users/sign_in.js,它甚至不在我自己的代码中(我猜可能是一个设计文件?)

关于如何进行这项工作的任何想法?

1 个答案:

答案 0 :(得分:0)

好的,所以这实际上是路由器问题。

在我的config/routes.rb中,首先提到了订阅#index和订阅#show的路线:

  resources :subscriptions, only: [:index, :show]
    get "subscriptions/save_subscription_choice", to: "subscriptions#save_subscription_choice", as: "save_subscription_choice"

这实际上是在使我的应用程序调用show方法。

我简单地切换了这两行,现在可以完美运行了。

正如@arieljuod指出的,

第二个问题是:设计授权。

由于在我的应用中默认情况下将用户身份验证before_action设置为true,因此我必须在订阅控制器中添加以下行:skip_before_action :authenticate_user!, raise: false, only: [:save_subscription_choice]