【问题标题】:Rails Controller - getting the index action to display only certain recordsRails Controller - 获取索引操作以仅显示某些记录
【发布时间】:2023-03-19 04:06:01
【问题描述】:

默认情况下,rails 控制器将在 index 操作中加载所有关联的对象。我想做的是只显示某些对象。

例如

我有一个名为 Car(id, make, model, year) 的模型。我只想列出索引中的特定品牌,具体取决于参数。

有几种方法可以做到这一点,我只是不确定哪种方法最好。

我可以:

将参数传递给链接:

cars_path(make: 'Acura') 

并且会给我 /cars/?make=Acura

设置路线:(这似乎变得混乱)

match "cars/:make" => "cars#index", constraints: {make: /[A-z]{1,20}/}

或者我可以为此创建一个单独的控制器操作

关于什么是最“rails-y”的方法有什么建议吗?回报率 3.1

【问题讨论】:

    标签: ruby-on-rails controller


    【解决方案1】:

    通常,当我们谈论过滤数据时,我更喜欢通过普通的旧 GET 变量(没有额外的路由定义)url?key=val&key-val 保持相同的索引操作和过滤参数。

    这有很多好处:

    • 网址可以收藏
    • 没有会话修补
    • 我可以重复使用过滤参数并将它们传递给分页链接等,以便在搜索有序时让过滤器跟随用户

    我不想做额外的路线,因为过滤器的复杂性很容易变得太高。如果过滤器参数很少并且您确定自己在做什么,您可以定义额外的好路由 url/param/param 但我发现这些情况很少甚至没有。

    【讨论】:

      【解决方案2】:

      如果您只想展示一个品牌的汽车,最好的 url imo 是:/makes/1-Acura/cars。因此,您只需在汽车控制器中获取该品牌的汽车即可。

      您是否有一个品牌表,或者它只是您的汽车表中的一根绳子?我想你应该有一个。

      resources :makes do
          resources :cars
      end
      

      使用这些路线,您必须测试汽车控制器的 index 操作中是否有 params[:make_id],如果是这样,您会得到这样的汽车:

      @cars = Make.find(params[:make_id]).cars
      

      或者你可以这样设置你的路线

      resources :makes do
          scope :module => "make_scope" do
              resources :cars
          end
      end
      

      这样,您可以像这样设置控制器:

      controllers
          - cars_controller.rb
          - make_scope (folder)
              - cars_controller.rb
      

      make_cars_path(@make) 路径会在 make_scope/cars_controller 中触发 index 操作,因此您不必担心 params[:make_id] 的存在,您只需知道您正在使用的汽车制作。

      否则,获取参数很好。不过,根据过滤器的复杂性,我认为定义一个新的路由来获得更漂亮的 url 并不坏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-13
        相关资源
        最近更新 更多