默认情况下,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
答案 0 :(得分:3)
通常,当我们讨论过滤数据时,我更喜欢通过普通的旧GET变量保留相同的索引操作和过滤参数(没有额外的路由定义)url?key=val&key-val
。
这有很多好处:
我不想制作额外的路线,因为过滤器的复杂性很容易过高。如果过滤器参数很少并且你确定你正在做什么,你可以定义额外的好路线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],您只知道您正在使用汽车一个品牌。
否则,获得参数很好。我不认为定义一条新路线以获得更漂亮的网址是不好的,具体取决于过滤器的复杂程度。