在控制器中访问 URI 参数

Accessing URI params in the controller

(我自己学习RoR,所以如果这是一个明显的问题,请原谅我) 我有一个应用程序可以跟踪存放在图书馆书架上的书籍。请求应该像这样:

GET books/library_id   => shows all books on every shelf in a library
GET books/library_id/shelf_id  => shows all books on one shelf in a library
GET books/library_id/shelf_id/book_id  => shows a particular book

POST 会使用类似的格式,除了我将在 POST 正文中使用 JSON 来提供本书的信息(作者、出版日期、长度等) 、书架或图书馆

我的问题是,传递到我的控制器的 [:params] 似乎包含查询(在 ? 之后的任何内容)和 POST 主体参数,但不是我需要的 URL解析并用于确定要显示的内容。有没有办法从参数中得到这个?我试图避免像 GET /books/?library_id/shelf_id

这样的事情

您可以设置一个路由,这样 params 除了包含查询字符串 and/or post 数据之外,还将包含特定的 URL 片段。

在config/routes.rb:

get 'books/:library_id(/:shelf_id(/:book_id))', to: 'books#show'

在app/controllers/books_controller.rb:

class BooksController < ApplicationController
  def show
    library_id = params[:library_id]
    shelf_id = params[:shelf_id]  # may be nil
    book_id = params[:book_id]  # may be nil

    # TODO: Do something with library_id, shelf_id (if present), 
    # book_id (if present).
  end
end

或者,如果您想使用一些非常自定义的逻辑来处理 URL,您可以使用像 get 'books/*sometext', to: 'books#show' 这样的通配符路由。然后,在您的控制器操作中,您可以手动解析 params[:sometext]。这将被视为 "not the Rails way",但如果您需要完全的灵活性,它就在那里。

最后,也许值得一提的是,在您的控制器操作中,您可以获得有关请求的信息,例如 request.pathrequest.fullpathrequest.url。但听起来你的情况不需要这个。