Rails阻止特定路由上的before_action

时间:2018-04-25 09:57:31

标签: ruby-on-rails

有没有办法防止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的

2 个答案:

答案 0 :(得分:3)

您可以使用onlyexcept选项:

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

exceptbefore_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