【问题标题】:Padrino: determining route name in controllerPadrino:在控制器中确定路线名称
【发布时间】:2012-06-21 05:49:54
【问题描述】:

有没有办法在 padrino 控制器中确定路由名称是什么?例如,在前块中,我希望能够根据路线采取一些预定的行动。所以,是这样的:

before do
  check_authorization_for(:route_name)
end

其中 ":route_name" 将类似于 "update" 或 "delete" 或 "create" 之类的。就像现在一样,我只有代码来检查当前用户是否有权在每个控制器方法的开头执行请求的操作。我们的授权方案依赖于我们的数据库中的信息,这些权限是在控制器操作上键入的,所以如果有办法确定控制器中的路由名称(即,如果我可以确定正在调用“更新”操作),我可以只用一个块来测试授权,而不必在每个操作中进行检查。

我确信一定有一种非常简单的方法可以做到这一点,但我似乎找不到任何文档。提前感谢您的帮助。

【问题讨论】:

    标签: routes padrino


    【解决方案1】:

    试试

    before :show, :edit, :destroy do
        Post.find(params[:id])
    end
    

    或者,如果您更喜欢直接访问路由对象:

    request.route_obj
    

    request.route_obj.controller
    

    如果要混合当前路径,rails中有类似current_page的东西。

    # http://localhost:3000/category/1/products/page/3
    current_path('page' => 4) # => http://localhost:3000/category/1/products/page/4
    

    【讨论】:

    • 不幸的是,这并不是我真正想要的。在我们的数据库中,我们将有一个类似于 {resource: 'foo', action: 'update', acl_id: 1234} 的授权记录,所以在控制器中,我希望能够执行类似“Actions. where(resource: 'foo', action: 'update')" 以找到 "acl_id" 值。在这个例子中,“update”是被调用的控制器动作,所以它不会在一个“id”参数中,它会是实际的控制器动作。这有意义吗?
    • 这几乎正是我所需要的。我最终使用了 request.route_obj.named.to_s,它得到了我想要的东西。我从未见过或听说过 request.route_obj,所以这非常有用。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2012-10-31
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多