rails 应用中的多个连续 AJAX 调用

Multiple consecutive AJAX calls in rails app

我目前有一个应用程序,访客可以使用 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,它甚至不在我自己的代码中(我猜可能是一个设计文件?)

关于如何使这项工作有任何想法吗?

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

在我的 config/routes.rb 中首先提到了 subscriptions#index 和 subscriptions#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]