rails 应用中的多个连续 AJAX 调用
Multiple consecutive AJAX calls in rails app
我目前有一个应用程序,访客可以使用 devise 通过 AJAX 表格进行注册。
我想增强此表单并执行以下操作:
- 当用户在页面上时,会出现一个带有订阅选项的模式。
- 他提交此表单后,就会显示注册表单。
- 他填写并提交表格后,付款表格(+所选订阅的概述)就会出现。
- 用户付款后,他将被重定向。
所以我正在考虑连续三个 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]
我目前有一个应用程序,访客可以使用 devise 通过 AJAX 表格进行注册。
我想增强此表单并执行以下操作:
- 当用户在页面上时,会出现一个带有订阅选项的模式。
- 他提交此表单后,就会显示注册表单。
- 他填写并提交表格后,付款表格(+所选订阅的概述)就会出现。
- 用户付款后,他将被重定向。
所以我正在考虑连续三个 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]