我的代码库包含类似的回调 prepend_before_action:authenticate_api_user! before_action:authenticate_api_v1_user! 这两者有什么区别?
答案 0 :(得分:12)
通常before_action
将before 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,'')
获取此特定会员。