将第二个参数添加到路由的最佳方式



我希望我的路线类似于car(/:country/):car_id,最好的方法是什么?只有"汽车"会列出所有汽车,"汽车/:国家"会列出该国制造的所有汽车。

现在我有了这样的路线资源:cars,:path=>"cars(/:country)",如果params[:country]为零,我会检查cars#index action,以确定将从数据库中检索到什么。

我的解决方案感觉是错误和丑陋的,我想最好的解决方案和最干净的解决方案是制作一个国家模型,但不知道如何组织起来,提示?country必须有一个slug,car_id也必须有(使用friendly_id作为car_id)。我觉得我应该有一张写着名字和鼻涕虫的汽车表,这就是我所想的。

谢谢!

首先我要说的是,您当前的解决方案既不难看,也不错误,最坏的情况是它很普通。但在没有看到所有涉及的模型和协会的情况下,我只能给出一个大致的答案。

首先,乡村车型,可能是个好主意,但你如何将其与汽车车型联系起来?

你可以这样做:

class Country << ActiveRecord::Base
has_may :cars
end
class Car << ActiveRecord::Base
belongs_to :country
end

这将支持语义,即您可以选择一个国家,并获得属于某个国家的所有汽车,即

@cars = Country.find('USA').cars

或者,你可以做一些类似的事情:

class Car << ActiveRecord::Base
has_one :country
end
class Country << ActiveRecord::Base
end

这将实现一种不同的语义:

@country = Car.find('Jeep').country

重点是考虑您希望在应用程序中具有的查询语义,然后定义您的关联以支持对您的应用程序有意义的语义。我发布了非常简单的关联,你可能会得到多个更复杂的关联,这取决于你需要如何查询数据库和相关的模型。

更新

您发布了:我希望我的路线类似于car(/:country/):car_id,

这没有意义,如果你知道特定的car_id,你就不需要任何过滤或额外的搜索。

听起来你想要这些网址:

/cars          # all cars
/cars/:country # all cars in country
/car/:id       # a specific car

假设您已经为汽车定义了完整的RESTful路线,即,那么第一条和第三条路线可能就在那里

config/routes.rb

resources :cars

你只需要添加到routes.rb:

GET '/cars/:country' => 'cars#index'

然后在app/controllers/cars_controller.rb:

def index
if params[:country]
@cars = Car.where("country_id = ?", params[:country])
else
@cars = Car.all
end
end

这假设您建立了一个关系,每个汽车记录都有一个country_id属性。这可以通过多种方式实现,例如:

class Car < ActiveRecord::Base
belongs_to :country
end

这意味着我的汽车表有一个country_id属性,我可以做一些类似的事情:

@car=car.fund(1001)

"汽车在#{@car.country.name}">

最新更新