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

时间:2018-04-12 07:44:32

标签: ruby-on-rails

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

1 个答案:

答案 0 :(得分:12)

通常before_actionbefore every action运行到method

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
  • 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

现在在任何控制器中,如果我们想在two之前执行three之前的任何其他方法,您可以使用prepend_before_action之类的 prepend_before_action :three, :two

class AdminsController < ApplicationController
  prepend_before_action :three, :two
end

现在,在three执行two之前,execute将获得three,然后 select stuff( ( select ',' + realname from sys_user where ','+'1,2,3'+',' like '%,'+cast(u_id as varchar(10))+',%' for xml path('') ),1,1,'') 获取此特定会员。