添加第二个参数以进行路由的最佳方法

时间:2012-09-18 15:02:51

标签: ruby-on-rails-3

我希望我的路线像汽车(/:country /):car_id,最好的方法是什么?只有“汽车”会列出所有汽车,“汽车/:国家”将列出在该国家制造的所有汽车。

现在我的路线就像这样的资源:cars,:path => “汽车(/:国家)”和我检查汽车#index action如果params [:country]为零,以确定将从数据库中检索什么。

我的解决方案感觉错误和丑陋,我认为最好的解决方案和最干净的方法是建立一个国家模型,但是真的不知道如何整理它,提示? country必须有一个slug,car_id也是如此(使用friendly_id作为car_id)。感觉就像我应该有一张带有名字和slug的汽车桌子,这些都是我想到的。

谢谢!

1 个答案:

答案 0 :(得分:2)

首先,我要说你现在的解决方案并不丑陋,也不错,最糟糕的是它是行人。但是,如果没有看到所有涉及的模型和关联,我只能给出一般答案。

首先,一个国家模型,可能是一个好主意,但你如何将它与汽车模型联系起来?

你可以这样做:

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

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

更新

你发布了: 我希望我的路线像汽车(/:country /):car_id,

这没有意义,如果您知道具体的car_id,则不需要任何过滤或额外搜索。

听起来像你想要这些网址:

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

第一条和第三条路线可能就是假设你已经为汽车定义了全套RESTful路线,即

配置/ 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.find(1001)

“这辆车在#{@ car.country.name}”