2014-10-29 1 views
2

Как говорится в заголовке, я ищу метод, который позволяет мне проверить, было ли выполнено действие (создание, обновление, уничтожение) в after_filter. Причина в том, что я хочу установить флеш-сообщение и в конечном итоге перенаправить create и update действия на edit вместо шоу.Любой способ проверить, было ли действие успешным в after_filter?

В настоящее время я делаю это как действие внутри блока controller, но было бы проще с фильтром before, потому что после завершения действия я могу подключить несколько элементов.

ответ

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 класс ужасен, но это было только грязно-и-быстро-хак, чтобы сделать это работает , Обратите внимание, что модуль должен быть включен перед любым другим модулем, который его использует.

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

Защиту обновить @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 говорит вам все, что вы надо знать.

Смежные вопросы