2013-12-17 12 views
18

Ich lese die "Agile Web Entwicklung mit Schienen 4", auf pag. 338 heißt es:Was bewirkt before_action, wenn in Rails 4 false zurückgegeben wird?

[...] Rückrufe können passiv sein, Überwachung der Aktivität von einem Controller durchgeführt. Sie können auch eine aktivere Rolle bei der Bearbeitung von Anfragen übernehmen. Wenn ein Call vor einer Aktion false zurückgibt, wird die Verarbeitung der Callback-Kette beendet und die Aktion wird nicht ausgeführt. [...]

Nun meine Zweifel ist die folgende: hier how to execute an action if the before_action returns false es wurde gesagt, dass das Ziel des before_action etwas vorzubereiten, bevor die Aktion ausgeführt wird, wenn es falsch gibt es nicht bedeutet, dass die Aktion wird nicht ausgeführt, aber nach dem Buch ist es richtig so ... also werde ich ein wenig verwirrt.

Wenn ich versuche, die folgende

class ProductsController < ApplicationController 
before_action :test 

    def index 
    @products = Product.all 
    end 


    private 

    def test 
     return false 
    end 
end 

Aber die Aktion ausgeführt wird, wenn ich /products nenne ich keine Fehlermeldung angezeigt und die Seite zeigt sich ganz gut

+0

weil akzeptierte Antwort irgendwie verwirrt mich und zu lang, tl; dr; Rückgabewert ist irrelevant – akostadinov

Antwort

36

before_action (früher before_filter benannt) ist ein Rückruf, der ausgeführt wird, bevor eine Aktion ausgeführt wird. Sie können mehr über controller before/after_action lesen.

Es wird normalerweise verwendet, um die Aktion vorzubereiten oder die Ausführung zu ändern.

Die Konvention ist, dass, wenn eine der Methoden in der Kette rendern oder umleiten, die Ausführung angehalten wird und die Aktion nicht gerendert wird.

before_action :check_permission 

def hello 
end 

protected 

def check_permission 
    unless current_user.admin? 
    # head is equivalent to a rendering 
    head(403) 
    end 
end 

In diesem Beispiel, wenn current_user.admin? false zurück, die hello Aktion wird nie ausgeführt.

Die eine folgende, stattdessen ist ein Beispiel Handlungsaufbau:

before_action :find_post 

def show 
    # ... 
end 

def edit 
    # ... 
end 

def update 
    # ... 
end 

protected 

def find_post 
    @post = Post.find(params[:id]) 
end 

In diesem Fall find_post nie falsch zurück. In der Tat ist der Zweck dieser before_action, einen geteilten Befehl aus dem Hauptteil der Aktionen zu extrahieren.

Über die Rückkehr false, soweit ich weiß, dies gilt für ActiveRecord Rückrufe. Aber für eine Vorher-Aktion hat die Rückgabe von Falsch keine Auswirkung. Tatsächlich wird der Rückgabewert in der offiziellen Dokumentation nicht als wichtig erwähnt.

+1

Wenn 'hallo' nie durchgeführt wird, was ausgeführt wird? – zer0uno

+0

Ich habe das Beispiel aktualisiert, um expliziter zu sein. In diesem Fall die Anfrage zurück 403. –

+0

Ich habe meine Frage – zer0uno

Verwandte Themen