正如标题所述,我正在寻找一种方法,可以让我检查after_filter
中的动作(创建,更新,销毁)是否成功。原因是我想设置一条Flash消息并最终将create
和update
操作重定向到edit
而不是show。
目前,我将此作为controller
块内的操作,但使用前置过滤器会更容易,因为我可以在操作完成后插入多个内容。
答案 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
课程的检查是可怕的,但它是唯一让它起作用的肮脏和快速的黑客攻击。
请注意,该模块必须包含在使用该模块的任何其他模块之前。