【问题标题】:How to create multiple index endpoints for one Rails controller如何为一个 Rails 控制器创建多个索引端点
【发布时间】:2015-08-13 22:33:22
【问题描述】:

这似乎是一个简单的问题,但我找不到答案。我的 Rails 应用程序中有书籍,还有精选书籍的范围。我想要一个列出所有书籍的端点,以及一个只列出精选书籍的端点。

我有一个带有一个索引操作的 API 图书控制器,因此 site.com/api/books 将返回所有图书。我如何制作将仅返回精选书籍的第二个端点?是否有其他查询方式,例如 /books?featured=true ?

谢谢。

【问题讨论】:

    标签: ruby-on-rails json api


    【解决方案1】:

    你有各种各样的选择,但也许最好的方法是定义这样的路线:

    get '/books(/:featured)' => 'controller#action'
    

    然后,在您的控制器中,类似:

    @books = params[:featured].present? ? Book.featured : Book.all
    

    这只是快速和肮脏的,但肯定会奏效。

    【讨论】:

    • 对此稍作清理,您无需在params[:featured] 上致电present?。如果没有提供特征参数,则返回nil,默认为Book.all。这也可以通过保护子句来完成,有些人可能会说这比使用三元速记更简洁。
    • 好的,我遇到了这个问题——在路线中,如果我有 get '/books(/:featured)' line above resources :books,那么我不能做书/45 来获得“表演”动作。如果我把它放在下面,books/featured 会出现路线重复错误。两个都可以吗?
    【解决方案2】:

    未经测试,但应该可以工作。

    routes.rb

    get "/books(/:type)" => "books#index", as: :books
    

    books_controller.rb

    // 有点灵活的情况,你只需输入一个你想要寻找的“过滤器”。你输入“featured”,它会寻找“featured=>true”。如果您输入“已发布”,它会查找“已发布=>true”

    def index
      if params[:type].present?
          @books = Book.where(params[:type].to_sym => true)
      else
          @books = Book.all
      end  
    end
    

    index.html.erb

    <% =link_to("all books", books_path) %>
    <% =link_to("feature_books", books_path(:featured)) %>
    <% =link_to("other scoped books", books_path(:other_scope)) %>
    

    【讨论】:

    • 很酷,你如何改变你的答案来采用我的答案,却不相信我。完全没问题,你调整了你的,但你应该在你这样做的时候给予信任。
    • 哇...真的吗?随便...所有功劳都归您所有-您喜欢的任何东西。也许您看到我还为该路线构建了一个灵活控制器。在我使用 /books 或 /books/:type 加载 Book.where(featured) 之前,它几乎是静态的。只是放松x兄弟。
    • 好的,我不想开始争论。我只是说你原来的答案,在我的不同之前,然后你改变了你的答案来匹配我的。这样做没有错,只要你这样做,就给予表扬。此外,值得单独验证“flex”参数以确保它包含有效属性,否则,这是一个好主意。 (例如 /books/jfklafjaklsfjaklsfjadslfkajs 会导致错误)
    • 你的答案比我的更完整,所以更有效:)
    • 好兄弟。你是对的,我改变了,但这与你的回答无关。实际上我在编辑我的答案后看到了你的答案。我刚刚发布了我的,感觉就像,我可以做得更好。当我们只使用路由默认值时,那很好 - 但是当只有另一个值时设置默认值没有意义所以我想出了将参数从默认值更改为存在或不存在并将部分用于一种过滤器.无论如何,希望很酷。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2021-06-17
    • 2012-12-19
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    相关资源
    最近更新 更多