Подтвердить что ты не робот

Что делает before_action, возвращающее false в Rails 4?

Я читаю "Agile Web Development с Rails 4", на странице. 338 говорится:

[...] Обратные вызовы могут быть пассивными, контролируя активность, выполняемую контроллером. Они также могут принимать более активное участие в обработке запросов. Если обратный вызов до действия возвращает false, обработка цепочки обратного вызова завершается, и действие не выполняется. [...]

Теперь я сомневаюсь в следующем: здесь как выполнить действие, если before_action возвращает false было сказано, что цель before_action - подготовить что-то до действие выполняется, если оно возвращает false, это не означает, что действие не выполняется, но, согласно книге, оно правильно... поэтому я немного запутался.

Если я пытаюсь выполнить следующие

class ProductsController < ApplicationController
before_action :test

  def index
    @products = Product.all
  end


  private

    def test
      return false
    end
end

Но действие выполняется, когда я вызываю /products, я не получаю никаких ошибок, и страница отображается просто отлично

4b9b3361

Ответ 1

before_action (ранее называемый before_filter) - это обратный вызов, который выполняется перед выполнением действия. Вы можете больше узнать о контроллере before/after_action.

Обычно он используется для подготовки действия или изменения исполнения.

Соглашение заключается в том, что если какой-либо из методов в цепочке визуализировать или перенаправлять, то выполнение останавливается и действие не отображается.

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

В этом примере, если current_user.admin? возвращает false, действие hello никогда не выполняется.

Ниже приведен пример установки действий:

before_action :find_post

def show
  # ...
end

def edit
  # ...
end

def update
  # ...
end

protected

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

В этом случае find_post никогда не вернет false. Фактически, целью этого before_action является извлечение общей команды из тела действий.

О возврате false, насколько я знаю, это верно для обратных вызовов ActiveRecord. Но для before_action возвращение false не имеет никакого эффекта. Фактически, возвращаемая стоимость не упоминается как важная в официальной документации.