如何为rails中的一个特定页面创建before操作?

时间:2017-06-24 03:29:57

标签: ruby-on-rails ruby-on-rails-4

我有两个控制器:pages_controller和charges_controller

pages_controller只有:

class PagesController < ApplicationController
    def show
        render template: "pages/#{params[:page]}"
    end
end

charges_controller具有接受费用的基本条带信息

我的routes.rb根目录设置为我的主页,并且:

get "/:page" => "pages#show"

我在views / pages /

中有大约8个html文件

我想要一个且只有一个页面,&#34; products.html.erb&#34;有一个before_action验证用户!

如果我向页面控制器添加一个before操作,它会影响每个页面。需要一些提示,新开发者。

4 个答案:

答案 0 :(得分:1)

您可以使用before_action挑出呈现“products.html.erb”的操作。如果它仅在您的show动作中呈现,则它看起来像:

before_action :authenticate_user, only: [:show]

您可以在其中添加任意数量的路线,例如:

before_action :authenticate_user, only: [:show, :create, :destroy]

Here是它的文档。

答案 1 :(得分:1)

您可以创建一个自定义私有方法来验证params[:page]参数的值,并根据您是否要限制它,然后在仅过滤之前应用设计authenticate_user show方法,如:

class PagesController < ApplicationController
  before_action :custom_authenticate_user!, only: :show

  # remains equal
  def show
    render template: "pages/#{params[:page]}"
  end

  private

  # only if params[:page] equal 'bla' then use the authenticate_user! 
  def custom_authenticate_user!
    authenticate_user! if params[:page] == 'bla'
  end

这也是一种更简单的方法,只需使用ifonly选项来检查参数并使其工作,而无需创建新方法:

class PagesController < ApplicationController
  before_action :authenticate_user!, only: :show, if: -> { params[:page] == 'bla' }

答案 2 :(得分:0)

class PagesController < ApplicationController
    def show
        if "#{params[:page]}" == "product"
          your action here
        end
        render template: "pages/#{params[:page]}"
    end
end
控制器内的<_> before_action通常用于new / show / edit / update之间的“相同代码”,因为你只需要一个页面的特殊代码,我认为你只需要在渲染之前执行命令

答案 3 :(得分:0)

使用before_action选项添加only:以传递要应用过滤器的操作数组。如果您希望该过滤器应用于除要跳过的操作名称之外的所有操作,则可以使用skip:传递一系列操作的另一个选项

class PagesController < ApplicationController
  before_action :authenticate_user!, only: [:show]

  def show
    render template: "pages/#{params[:page]}"
  end
end