我在控制器中有一个update方法,如果params[:single]的值为1,我想运行一个create_exception方法,如下所示,并且不更新记录:
before_action :create_exception, only: %i[ update ]
def update
if @event.update(event_params) ...
end
private
def create_exception
if params[:single] == 1
@exception = @event.event_exceptions.create(date: params[:exception_date])
respond_to do |format|
format.turbo_stream
format.html { redirect_to events_path, notice: "Event was successfully updated." }
format.json { head :no_content }
end
end
end
我的第一个问题是create_exception方法在我更新一个事件时似乎没有被触发。它只是调用update并更新记录上的信息,而这不是我想要的。如果params[:single] = 1,我想创建一个expection并重定向回调度而不更新事件。
实现这一目标的最佳方法是什么?
2条答案
按热度按时间dy1byipe1#
参数值总是字符串,所以检查
params[:single] == "1"
。before_action对于执行通常在操作运行之前应该发生的事情很有用,比如检查权限。
它不应该被用来改变单个动作的行为,那就是超距动作。
而是检查update方法和return early中的参数。
update的完整行为很清楚,它不依赖于读者了解before_action如何工作的细节。
oyjwcjzk2#
来自指南:
它还说:
所以我认为,根据您所展示的代码,只有在遇到
format.html { redirect_to events_path, notice: "Event was successfully updated." }
时,才会停止执行您是否正在使用HTML请求访问此控制器?
format: turbo_stream
和format: json
不会执行任何重定向,因此不会停止执行操作。如果您正在进行常规HTML请求,是否可以将一些Web控制台代码添加到您的问题中,以便进一步进行故障排除?