2016-03-21 17 views
1

Bu geri aramaların geri kalanıyla nasıl çalıştığını ve özellikle de çağrı yığınının (append_)before_action veya prepend_before geri çağrılarını kullanarak nasıl göründüğünü anlamıyorum. etrafında eylem geri arama böyle bir erişim kontrolü için iyi olur:Geri arama yığınının etrafında hareketsizlik var

ApplicationController < ... 

    around_action :access_control 

    private 

    def access_control 
    if @authorized 
    yield 
    else 
    # Show error page 
    end 
end 

class AdminController < ApplicationController 

    before_action :authorize_admins 

    private 

    def authorize_admins 
    if current_user.admin? 
     @authorizez = true 
    end 
    end 

bir append_before_action + prepend_after_action veya prepend_before_action + append_after_action gibi davranır around_action mu?

Ya da başka bir şey?

+0

'append_' ve' prepend_' biraz farklı şeylerdir:

class SomeController < ApplicationController before_action :before_action after_action :after_action around_filter :around_action def before_action $stderr.puts "From before_action" end def after_action $stderr.puts "From after_action" end def around_action begin $stderr.puts "From around_action before yielding" yield $stderr.puts "From around_action after yielding" end end def index end end 

ben günlüğüne aşağıdaki aldık. Bu bağlamda problemi görmeyecektim. Aslına bakarsanız, sorunuz mantıklı değil. around_action, before_action + after_action'ın aynı yere yerleştirilmesi gibi davranır. ('önce (sonra) _filter', Rails 4'ten önce" sonra "ile aynıdır.) – chumakoff

+0

@chumakoff 'append_before_action'' before_action' için bir takma addır ve after_action için aynı şey olduğunu anlamıştım. Daha net bir açıklık için her şeyi 'action' ve 'callback' ile yeniden yazdım –

cevap

3

around_actionappend_before_action + prepend_after_action gibidir.

Dahili olarak, rails'un iki diziye, @before_actions ve @after_actions gibi düşünün. Yani, around_action bildirdiğinizde, @before_actions sonuna ekler/ekler ve @after_actions için unshift/prepends. Hızlı bir test ile

şöyle:

Started GET "/" for 127.0.0.1 at 2016-03-21 17:11:01 -0700 
Processing by SomeController#index as HTML 
From before_action 
From around_action before yielding 
    Rendered some/index.html.slim within layouts/index (1.5ms) 
From around_action after yielding 
From after_action 
+0

Bir denetleyici aşağıdaki filtrelere sahipse: 'after_action: action1'; 'around_action: action2' sonra' action2' action1' önce bitirir? – chumakoff

+0

Evet, lütfen güncellemede örnek kod ve çıkışa bakın. – Dharam

+0

Sağın dostum! ActiveRecord'da 'around_' geri aramaları gibi. – chumakoff