我有两个控制器: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操作,它会影响每个页面。需要一些提示,新开发者。
答案 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
这也是一种更简单的方法,只需使用if
和only
选项来检查参数并使其工作,而无需创建新方法:
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