有什么方法可以检查after_filter中的操作是否成功?

时间:2014-10-29 14:22:31

标签: ruby-on-rails activeadmin

正如标题所述,我正在寻找一种方法,可以让我检查after_filter中的动作(创建,更新,销毁)是否成功。原因是我想设置一条Flash消息并最终将createupdate操作重定向到edit而不是show。

目前,我将此作为controller块内的操作,但使用前置过滤器会更容易,因为我可以在操作完成后插入多个内容。

2 个答案:

答案 0 :(得分:2)

因为我们已经在控制器中有一个表示成功/失败的声明,所以我们应该避免重复这些努力。

您可以使用response.status代码来确定您的操作是否成功。这假设你遵循我们99%的时间做的惯例。

class ApplicationController < ActionController::Base
  after_action :maybe_flash
  private
  def succeeded?
    response.status < 400 && response.status >= 200
  end

  def maybe_flash
    # do something here
  end
end

假设您有phones_controller.rb

def更新     @phone = Phone.find(params [:id])

respond_to do |format|
  # if @phone.update_attributes(params[:phone])
  if @phone.update_attributes phone_params
    format.html { redirect_to @phone, notice: 'Phone was successfully updated.' }
    format.json { render :show }
  else
    format.html { render action: "edit" }
    format.json { render json: @phone.errors, status: :unprocessable_entity }
  end
end

status告诉你需要知道的一切。

答案 1 :(得分:0)

看起来不是一个简单的方法。 我解决了一个可以添加到控制器的模块并执行以下操作:

  module ActionStatus

    [:create, :update, :destroy].each do |parsed_action|
      define_method(parsed_action) do |&block|
        super() do |success, failure|
          @action_successful = failure.instance_of?(
            InheritedResources::BlankSlate
          ) || failure.class.nil?
          block.call(success, failure) unless block.nil?
        end
      end
    end

    def action_successful?
      @action_successful = false if @action_successful.nil?
      @action_successful
    end

    def action_failure?
      !action_successful?
    end

  end

我知道对failure课程的检查是可怕的,但它是唯一让它起作用的肮脏和快速的黑客攻击。 请注意,该模块必须包含在使用该模块的任何其他模块之前。