有没有办法防止before_action
在特定路线上运行?说,发布做api动作的路线?我的行动目前正在做这个
before_action :setContext
def setContext
@site = Site.find_by!(host: request.subdomain)
@page = Page.find_by!(site_id: @site.id, slug: request.path)
end
在api路线上,Page找到了404的
答案 0 :(得分:3)
您可以使用only
和except
选项:
before_action :setContext, only: [:show, :edit]
before_action :setContext, except: [:new, :destroy]
您还可以将if:
或unless:
选项与lambda:
before_action :setContext, if: -> { request.format.html? }
before_action :setContext, unless: -> { request.format.json? }
如果在父类中定义了skip_before_action
,您也可以使用before_action
:
class ApplicationController
before_action :authenticate_user!
end
class ThingsController < ApplicationController
skip_before_action :authenticate_user!, only: [:index, :show]
end
答案 1 :(得分:0)
检查request.format.json?
的一种方法。
before_action :setContext
def setContext
unless request.format.json?
@site = Site.find_by!(host: request.subdomain)
@page = Page.find_by!(site_id: @site.id, slug: request.path)
end
end
将except
与before_action
一起使用的另一种方式。
before_action :setContext, except: [:api_actions] # put all comma separated routes in place of api_actions
def setContext
@site = Site.find_by!(host: request.subdomain)
@page = Page.find_by!(site_id: @site.id, slug: request.path)
end