Rails Controller - 获取索引操作以仅显示某些记录

时间:2011-12-13 17:14:28

标签: ruby-on-rails controller

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

例如

我有一个名为Car的模型(id,make,model,year)。我希望列表中的特定品牌只取决于参数。

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

我可以:

将参数传递给链接:

cars_path(make: 'Acura') 

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

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

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

或者我可以为此

单独执行控制器操作

有关什么是最“轨道式”的方法的任何建议吗? RoR 3.1

2 个答案:

答案 0 :(得分:3)

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

这有很多好处:

  • url具有书签功能
  • 没有会话修补
  • 我可以重复使用过滤参数并将它们传递给分页链接,以便在搜索顺序时让过滤器跟随用户

我不想制作额外的路线,因为过滤器的复杂性很容易过高。如果过滤器参数很少并且你确定你正在做什么,你可以定义额外的好路线url/param/param,但我发现这些情况几乎没有。

答案 1 :(得分:2)

如果您只想显示一个品牌的汽车,那么最好的网址是:/makes/1-Acura/cars。因此,您只需在汽车控制器中获得此品牌的汽车。

你有制作表还是只是你车牌中的一个字符串?我想你应该有一个。

resources :makes do
    resources :cars
end

使用这些路线,您必须测试汽车控制器的索引操作中是否存在参数[: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中的索引操作,因此您不必担心存在params [:make_id],您只知道您正在使用汽车一个品牌。

否则,获得参数很好。我不认为定义一条新路线以获得更漂亮的网址是不好的,具体取决于过滤器的复杂程度。

相关问题