首页 > 解决方案 > 更新前检查记录

问题描述

目标:检查记录是否已经更新,如果记录已经更新,则允许或不允许更新。

这是为了防止买家在没有更新信息的页面上并在订单完成后尝试取消订单。

我有以下代码,它可以工作但也不能正常工作:

private

    def prevent_order_update
      @order = Order.find(params[:id])
      if ( @order.order_status[2] || @order.order_status[3] ) 
        redirect_to @order, notice: "Your request status for Order:#{@order.id} has already been updated."
      end
    end

和:

  before_action :prevent_order_update, :only => [:update]

:order_status这有效,但如果is也“有效” 1,这是不应该的。

如果订单状态不是1.

订单状态来自模型枚举 1,2,3。

我也尝试过使用:

if ( @order.order_status[2] || @order.order_status[3] ) && @order.order_status_previously_changed?

这完全阻止了prevent_order_update一起工作。

和:

( @order.order_status[2] || @order.order_status[3] ) != @order.order_status[1]

然后一起阻止我的更新方法,并且prevent_order_update在订单状态为时仍然给我方法通知1

标签: ruby-on-railsruby

解决方案


@order.order_status当涉及到 rails 枚举时,它对应于字符串。在你的情况下,说@order.order_statusis charged。当您执行@order.order_status[2]它时,它实际上会产生字符串a的第三项。charged在这种情况下,比较总是返回 true。所以试试下面的代码:

    def prevent_order_update
      @order = Order.find(params[:id])
      if ( @order.charged? || @order.canceled? ) 
        redirect_to @order, notice: "Your request status for Order:#{@order.id} has already been updated."
      end
    end

推荐阅读