通过定义 routes.rb 可以生成不同的路径,,那么,反过来,是否能根据当前的路径查询其路由信息(即在 route.rb 中的定义)?比如:当前路径为/articles/show/1,通过某个 API 比如 Route#member? 可自动判断出是 collection 方法还是 member 方法。
Rails.application.routes.recognize_path '/path/to/something'
可以拿到 controller action params
不知道怎么拿到是 collection 还是 member。
不太明白 LZ 的意思,不过关注下。
猜测你要解决的问题是多个 path 指向同一个 action,并且要在 action 内针对不同的 path 做不同的处理。
通常来说 member 能拿到 id,而 collection 不能,检查params[:id]即可。
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] 的方法进行判定的前提,就是所有定义的路由规则,都遵从这一约定。