ruby-on-rails Rails -如何跳出一个控制器方法?

am46iovg  于 2023-01-30  发布在  Ruby
关注(0)|答案(2)|浏览(202)

我在控制器中有一个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并重定向回调度而不更新事件。
实现这一目标的最佳方法是什么?

dy1byipe

dy1byipe1#

参数值总是字符串,所以检查params[:single] == "1"
before_action对于执行通常在操作运行之前应该发生的事情很有用,比如检查权限。
它不应该被用来改变单个动作的行为,那就是超距动作。
而是检查update方法和return early中的参数。

def update
    return create_event_exception if params[:single] == "1"

    # update as normal
  end

  private

  def create_event_exception
      @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

update的完整行为很清楚,它不依赖于读者了解before_action如何工作的细节。

oyjwcjzk

oyjwcjzk2#

来自指南:

    • redirect_to和redirect_back不会在方法执行后立即停止和返回,而只是设置HTTP响应。方法中在它们之后出现的语句将被执行。如果需要,可以通过显式返回或其他停止机制停止。**

它还说:

    • 如果呈现或重定向"之前"的筛选器,则操作将不会运行。如果计划在该筛选器之后运行其他筛选器,则这些筛选器也将被取消。**

所以我认为,根据您所展示的代码,只有在遇到format.html { redirect_to events_path, notice: "Event was successfully updated." }时,才会停止执行
您是否正在使用HTML请求访问此控制器?format: turbo_streamformat: json不会执行任何重定向,因此不会停止执行操作。如果您正在进行常规HTML请求,是否可以将一些Web控制台代码添加到您的问题中,以便进一步进行故障排除?

相关问题