说明:
我正在从事汽车经销商项目..从A到Z销售各种品牌的汽车。我想为每个车牌制作带有链接的小盒子。点击Mercedes for ex,将为所有汽车渲染所有奔驰汽车等等。这就是我现在所拥有的:
汽车控制器 中的
def mercedes
...
@cars = Car.where('carname_id = 1').order('created_at desc').paginate :page => params[:page], :per_page => 5
end
和每辆车这样的代码,30件..但会有更多 在视图中我有
<%= link_to 'Mercedes', :controller => :cars, :action => :mercedes %>
此代码约30行,每辆车一行。除此之外我还有30个视图文件..好吧,有了视图,我想我可以使用一部分用于所有汽车
问题:
如何在更少的代码中完成此操作。也许它会有所帮助..我有一张名为carnames的桌子,我把所有的汽车放在那里,所以我感冒了像
<% @carnames.each do |car| %>
<%= link_to '<%= carname.name %>', :controller => :cars, :action => :<%= carname.name %> %>
<% end %>
我认为这会产生每辆车的链接,我可以写它们,问题是它们在控制器中......我不确定是否可以编写这么多代码。我希望我说清楚。谢谢你的时间。
修改
这是我的汽车存储方式:
我将烛台保存在名为carnames和carmodels中的模型的表中。每个表都有一个ID字段和名称字段..所以Meredes E class for ex将具有来自carname表的carname,具有特定的id_carname和来自carmodel表的E类具有特定的id_carmodel ..我拥有所有模型的所有belongs_to和has_many。
答案 0 :(得分:4)
你遇到了麻烦,因为你做错了。控制器动作称为“梅赛德斯”响铃警钟。理想情况下,你有一个品牌型号/控制器,其中有很多车。例如:
class BrandsController < ApplicationController
def show
@brand = Brand.find params[:id]
end
end
class CarsController < ApplicationController
def index
@brand = Brand.find params[:brand_id]
@cars = @brand.cars.paginate(:page => params[:page], :per_page => 5)
end
end
class Brand < ActiveRecord::Base
has_many :cars
# With this, your car URL could be /brands/1-mercedes/cars,
# instead of just /brands/1/cars.
def to_param
"#{self.id}-#{self.name}"
end
end
class Car < ActiveRecord::Base
belongs_to :brand
end
resources :brands do
resources :cars
end
<h1><%= @brand.name %></h1>
<% @cars.each do |car| %>
<%= link_to car.name, [@brand, car] %>
<% end %>
供参考,您可以使用carname.name.to_sym
,如下所示:
<% @cars.each do |car| %>
<%= link_to car.name, :controller => :cars, :action => car.name.to_sym %>
<% end %>
虽然传递car
记录应该足够了:
<% @cars.each do |car| %>
<%= link_to car.name, car %>
<% end %>
然而,这并没有改变您编写错误的代码。