2015-05-28 4 views
2

У меня есть два метода, которые я хочу запустить в нескольких действиях контроллера.Multiple before_action в контроллере Rails?

def get_offer 
    @offer = Offer.find_by :uuid => params[:offer_id] 
    if @offer.blank? 
     error_response = ErrorResponse.new("Offer not found") 
     render json: error_response, :status => :not_found and return 
    end 
    end 

    def validate_api_v2 
    api_version = params[:api_version] 
    if api_version != api_version_to_validate 
     error_response = ErrorResponse.new("API version not supported") 
     render json: error_response, :status => :bad_request and return 
    end 
    end 

Как я могу запустить их обоих в действиях action_a, action_b, только один в action_c и action_d, и ни один из них в action_e?

ответ

2

Вы могли бы сделать это следующим образом:

before_action :get_offer, only: [:action_a, :action_b, :action_c] 
before_action :validate_api_v2, only [:action_a, :action_b, action_d] 
+0

Будут ли выполняться эти функции в том же порядке, что и определено? – Nimo

+0

Не гарантируется. Если вам нужно, чтобы один из них был первым, вы наверняка можете использовать 'prepend_before_action'. Вы можете прочитать здесь: http://hollandaiseparty.com/order-of-abstractcontrollercallbacks/ – IngoAlbers

1

Move get_offer и validate_api_v2 к ApplicationController, а затем в остальных контроллерах, например, вы можете сделать:

class SomeController < ApplicationController 
    before_filter :get_offer, :validate_api_v2, :only => [:action_a, :action_b] 
end 

и:

class SomeOtherController < ApplicationController 
    before_filter :get_offer, :only => [:action_c, :action_d, :action_e] 
    before_filter ::validate_api_v2, :only => [:action_c, :action_d] 
end 

Надеюсь, вы поняли суть.

+0

Да, OP получил вашу точку .. +1 –

0

except пригодится для некоторых случаев:

before_action :get_offer, only: [:action_a, :action_b, :action_c] 
before_action :validate_api_v2, except: [:action_e, :action_c] 
0

Попробуйте один

before_filter :action_a, :action_b, only: [:action_c, :action_d] 
1

пишут методы заботы контроллера. Например:

# app/controllers/concerns/example_concern.rb 
module ExampleConcern 
extend ActiveSupport::Concern 

protected 
def get_offer 
    @offer = Offer.find_by :uuid => params[:offer_id] 
    if @offer.blank? 
    error_response = ErrorResponse.new("Offer not found") 
    render json: error_response, :status => :not_found and return 
    end 
end 

def validate_api_v2 
    api_version = params[:api_version] 
    if api_version != api_version_to_validate 
    error_response = ErrorResponse.new("API version not supported") 
    render json: error_response, :status => :bad_request and return 
    end 
end 
end 

Теперь в контроллере включите модуль в проблему и вызовите методы, используя before_action по мере необходимости. Например:

# app/controllers/examples_controller.rb 
class ExamplesController < ApplicationController 
    include ExampleConcern 

    before_action :get_offer, only: [:action_a, :action_b, :action_c] 
    before_action :validate_api_v2, only: [:action_a, :action_b, :action_d] 

    def action_a 
    end 
    def action_b 
    end 
    def action_c 
    end 
    def action_d 
    end 
    def action_e 
    end 
end 
Смежные вопросы