Rails 根据当前路径,查询是 collection 还是 member 方法?

whocare · 2012年07月02日 · 最后由 whocare 回复于 2012年07月03日 · 3731 次阅读

通过定义 routes.rb 可以生成不同的路径,,那么,反过来,是否能根据当前的路径查询其路由信息(即在 route.rb 中的定义)?比如:当前路径为/articles/show/1,通过某个 API 比如 Route#member? 可自动判断出是 collection 方法还是 member 方法。

  • rails 中是否存在这样的 API?
  • 如果必须自行编写,rails 中是否有相关的 route helper api?

Rails.application.routes.recognize_path '/path/to/something'

可以拿到 controller action params

不知道怎么拿到是 collection 还是 member。

不太明白 LZ 的意思,不过关注下。

猜测你要解决的问题是多个 path 指向同一个 action,并且要在 action 内针对不同的 path 做不同的处理。

通常来说 member 能拿到 id,而 collection 不能,检查params[:id]即可。

更严谨的解决方法是

resources :post do
  post :search, on: :collection, defaults: { type: :collection }
  post :search, on: :member, defaults: { type: :member }
end

这个问题的起因是做一个类似 activeAdmin 的 gem,,希望自动根据当前 action 设定某些允许的 action,比如当前是:show,则允许 [:edit,:delete],反之若是:index,,则只能允许 collection 类的 action。因此需要能自动判定 action 是 collection or member?

检查 params[:id] 是一个方法,但总感觉有一些局限性,比如/account/profile 之类。我的愿望是,既然我们在编写 route.rb 时已经明确了各类信息,为什么没有一个 api 能够访问这些信息呢?

比如,我又有一个问题,,如何判定当前的 controller 是单数 (resource) 还是复数 (resources) 资源呢?

#4 楼 @whocare 你可以想象 member 和 collection 是一个 helper,并不是一种特殊的标识,不用 member 也可以写一个长点的规则实现同样的路由。

@Rei 嗯,基于各位的讨论,我目前的结论就是,在 rails 的 routes 实现中,并没有将路由信息存储在某个数据结构里,一切都是动态 helper 方法中生成的,因此,也就没有简单进行反查的方法。

此外,由 member 和 collection 生成的 url,仅是一种约定。换句话说,要使用 params[:id] 的方法进行判定的前提,就是所有定义的路由规则,都遵从这一约定。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号