访问控制器中的URI参数

时间:2015-06-23 19:46:36

标签: ruby-on-rails ruby ruby-on-rails-3 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

这样的东西

1 个答案:

答案 0 :(得分:0)

您可以设置路由,以便params除查询字符串和/或发布数据外还包含特定的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]。这将被视为“不是Rails方式”,但如果您需要完全的灵活性,它就在那里。

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