ruby-on-rails - ActionController 回调过滤器链是否一致?

标签 ruby-on-rails spree

我有这个遗留的 Spree 应用程序,带有 2 个带有继承回调的装饰 Controller :

Spree::Api::BaseController.class_eval do

  before_action :load_api_key_user, only: [:index, :show, :jstree]

  before_action :override_params, only: [:create, :new]

  before_action do
    api_key_user = Spree.user_class.by_store(
        current_store
    ).find_by(spree_api_key: api_key.to_s)
    if api_key_user && (api_key_user.admin? || api_key_user.manager?)
      load_api_key_user
    end
  end
  before_action :load_user
  before_action :authenticate_user
  before_action :load_user_roles
  ...


Spree::Api::V1::OrdersController.class_eval do
  # Allow non authenticated user to perform some actions..
  before_action :load_api_key_user, only: [:create, :apply_coupon_code]
  before_action :load_user
  # only owners of the order are allowed to handle order.
  before_action :authorize_for_order, except: [:create, :index, :apply_coupon_code]
  before_action :authenticate_user
  before_action :load_user_roles

过滤器顺序链与具有相同 ruby​​ 版本(ruby 2.2.1p85)和相同 gem 版本的不同机器不同,这会产生意外行为。我用这个命令检查订单:
Spree::Api::V1::OrdersController._process_action_callbacks.map{|c| "#{c.kind}:#{c.filter}"}

同样的配置,结果是不同的。

native :["before:set_user_language", "before:set_version", "before:set_guest_token", "before:set_content_type", "before:set_xhr_redirected_to", "before:set_request_method_cookie", "after:abort_xdomain_redirect", "before:override_params", "before:70133939841780", "before:search_ransack_by_store", "before:search_ransack_by_region", "before:find_order", "before:load_api_key_user", "before:load_user", "before:authorize_for_order", "before:authenticate_user", "before:load_user_roles", "before:remove_email_from_params_if_nil", "before:70133903534220", "before:70133903532720", "before:70133931867720", "before:70133931866900"]
远程机器:["before:set_user_language", "before:set_version", "before:set_guest_token", "before:set_content_type", "before:set_xhr_redirected_to", "before:set_request_method_cookie", "after:abort_xdomain_redirect", "before:find_order", "before:authorize_for_order", "before:remove_email_from_params_if_nil", "before:46966032393140", "before:46966032349400", "before:46966032346700", "before:46966032344600", "before:load_api_key_user", "before:override_params", "before:46966007219340", "before:load_user", "before:authenticate_user", "before:load_user_roles", "before:search_ransack_by_store", "before:search_ransack_by_region"]
所以我有相同的 ruby​​ 版本和相同的 gem set。还有什么可以解释这种变化?

最佳答案

功能集是相同的,它们的顺序是不同的你的意思是?

ActionController 回调过滤器链不一致。

我在开发MFC项目的时候遇到过这种事情。

当时,当我以 Debug模式运行时,没有错误,当以实模式运行时,出现 RUNTIME 错误,我修复了这个错误。

RUNTIME 错误是由函数命令引起的。

事件函数 OnCreate 和 OnResizeWindow 引起了我的注意。

debug mode: OnCreate() is called before OnResizeWindow()
real mode:  OnCreate() is called after  OnResizeWindow()

我以为是系统中断的原因。

然后关于你的项目:
在远程机器上,会比在本地机器上有更多的中断。

要修复您的错误,您必须在自己的代码上构建函数排序系统。

关于ruby-on-rails - ActionController 回调过滤器链是否一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44501110/

相关文章:

CSS 文件位置 Ruby

ruby-on-rails - 将变量从 .txt 文件插入 ERB

ruby-on-rails - stub 图像 url 并返回图像

ruby-on-rails - 登录后 spree 重定向

ruby-on-rails - fe_sendauth : no password supplied encountered with Amazon RDS

ruby-on-rails - Active Record 运行所有查询两次

javascript - ruby on rails 中类别的四级 TreeView

ruby-on-rails - Spree 自定义/扩展用户角色和权限

ruby-on-rails - 未定义的方法 `has_one_attached' - Spree、AWS S3、产品图片、Rails

ruby-on-rails - 在 Spree (RoR) 中保存产品时,价格乘以 100