我有两个控制器企业和特价商品。他们都有一个商业表和一个特别表。他们是关系型的。控制器Specials有一个名为business_id的列,它连接到数据库Business和该id。我试图这样做,当你点击特价控制器索引视图上的链接时,它转到业务控制器显示视图的业务链接,所以链接是业务/ nameofbusiness
---企业控制器---
class BusinessesController < ApplicationController
def show
@business = Business.find(params[:id])
end
end
---商业模式---
class Business < ActiveRecord::Base
has_many :specials
end
- 特别控制器
class SpecialsController < ApplicationController
def index
@specials = Special.all
end
def show
@special = Special.find(params[:business])
end
end
- 特殊模式---
class Special < ActiveRecord::Base
belongs_to :business
end
---特价控制器的索引视图 -
<h1> Specials </h1>
<% @specials.each do |special| %>
<hr />
<h4> <%= link_to special.name, special %> </h1>
<h6> <%= link_to special.business.business_name, business_path(@special) %> </h6>
<p> <%= special.description %> </p>
<hr />
<% end %>
答案 0 :(得分:0)
link_to帮助程序使这非常容易。以这种方式使用它。
<h6> <%= link_to special.business.business_name, special.business %> </h6>
如果您想要路径中的业务名称,则需要执行更多操作。宝石FriendlyId是为此而制作的。 Here's a great (free) railscast on how to use it.
答案 1 :(得分:0)
你必须为此创建一个新的路由,因为business_path将被转换为类似business /:id的东西,所以在你的config / routes.rb中你可以添加:
get "/businesses/:business_name" => "businesses#show", :as => :business_show
当然在你的控制器上你不能再做一个简单的查找,所以你可以使用这样的东西:
@business = Business.find_by_name(params[:business_name])
注意:这里你将有两条不同的params路由到同一个动作(business_path将继续发送带有params [:id]的请求到show动作)并且会因此而出现问题,所以你可以做两件事:
如果您不再使用默认的show route(例如:business /:id),您可以将其添加到路径文件中:
resources :businesses, except: :show
创建一个单独的操作来处理这种请求,因此不要使用show,而是使用show_business。
get "/businesses/:business_name" => "businesses#show_business", :as => :business_show