寻找一种更简单的方法来在rails 3中渲染结果

时间:2011-10-14 22:34:39

标签: ruby-on-rails ruby

说明:

我正在从事汽车经销商项目..从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。

1 个答案:

答案 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 %>

然而,这并没有改变您编写错误的代码。