Rails中的before_action和prepend_before_action有什么区别?

Ume*_*tra 6 ruby-on-rails

我的代码库包含prepend_before_action:authenticate_api_user等回调函数!before_action:authenticate_api_v1_user!这两者有什么区别?

Sra*_*van 16

一般before_action运行before every actionmethod

prepend_before_action它做了什么.它只是在索引零处添加您的定义.

这是一个很好的用例来证明:

class ConfuseUsersController < ApplicationController
  prepend_before_action :find_user, only: [:update]
  prepend_before_action :new_user, only: [:create]

  before_action :save_and_render

  def update
  end

  def create
  end

  private

  def find_user
    @user = User.find(params[:id])
  end

  def new_user
    @user = User.new
  end

  def save_and_render
    persited = @user.persited?

    @user.assign_attributes(user_params)
    if @user.save
      redirect users_path(@user)
    else
      render (persited ? :edit : :new)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)
  • before_action :save_and_render这使得save_and_render在每个动作之前被调用.
  • prepend_before_action :find_user, only: [:update]这可以find_user预先知道函数save_and_render

让我们再看一个例子:

我们有一个ApplicationController地方,

class ApplicationController < ActionController::Base
  before_action :one
  before_action :three
end
Run Code Online (Sandbox Code Playgroud)

现在,在任何控制器,如果我们要执行的例如任何其他方法two之前,three你可以使用 prepend_before_actionprepend_before_action :three, :two

class AdminsController < ApplicationController
  prepend_before_action :three, :two
end
Run Code Online (Sandbox Code Playgroud)

现在,在three执行之前two将获得execute,然后three为此特定的meethod.