ruby-on-rails - 更新前检查记录
问题描述
目标:检查记录是否已经更新,如果记录已经更新,则允许或不允许更新。
这是为了防止买家在没有更新信息的页面上并在订单完成后尝试取消订单。
我有以下代码,它可以工作但也不能正常工作:
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
解决方案
@order.order_status
当涉及到 rails 枚举时,它对应于字符串。在你的情况下,说@order.order_status
is 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
推荐阅读
- sql - 将数据库中所有表的前 100 行数据透视到列中
- android - 在 Kotlin 中无法识别 Android 可为空的注释
- python - Python 在传感器的 DLL 中调用 SDK 函数,该函数获取指针 IP 和端口并返回 void*(void* 配置文件传感器的句柄。)
- phpstorm - 如何让 PhpStorm 在调试控制台中更改字体?
- docker - Windows 上的 Docker 和 WSL Ubuntu 找不到 docker-entrypoint.sh - 找不到文件
- python - 为 django 测试创建经过身份验证的用户
- c++ - boost::asio 将动态大小的数据传递给异步处理程序的问题
- activiti - 暂停流程实例
- android - 为什么我恢复的项目在 Firebase 控制台中不可见?
- html - 内联块的行为不像它应该的那样