在控制器中访问 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.path
、request.fullpath
、request.url
。但听起来你的情况不需要这个。
(我自己学习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.path
、request.fullpath
、request.url
。但听起来你的情况不需要这个。