我正在尝试这样做:
县名单
县1(链接到县1内的位置 县2(链接到县2内的位置列表 等
县1内的地点列表
位置1(指向位置页面的链接 位置2等
我的路线如下:
Rails.application.routes.draw do
resources :counties do
resources :locations
end
root 'home#index'
get "/:county_name_with_prefix" => "counties#show_by_name"
get "/:location_name_with_prefix" => "locations#show_by_name"
end
我的CountiesController是这样的:
class CountiesController < ApplicationController
before_filter :extract_county_name, :only => [:show_by_name]
**before_filter :extract_location_name, :only => [:show_by_name]**
def index
@counties = County.all
@locations = Location.all
end
def show
@county = County.find(params[:id])
@locations = Location.all
end
def show_by_name
@county = County.find_by_name(@county_name)
@locations = Location.all
render :show
end
private
def extract_county_name
@county_name = params[:county_name_with_prefix].gsub(County::ROUTE_PREFIX,"").gsub("-", " ").strip
end
**private
def extract_location_name
@location_name = params[:location_name_with_prefix].gsub(Location::ROUTE_PREFIX,"").gsub("-", " ").strip
end**
end
县指数视图是这样的:
<p>List of all counties</p>
<ul>
<% @counties.each do |county| %>
<li><%= link_to "Locations in #{county.name}", generate_county_url_with_prefix(county) %></li>
<% end %>
</ul>
县展示视图是这样的:
<h1>Domestic Cleaning Services in <%= @county.name %></h1>
<ul>
<% @locations.each do |location|%>
<li><%= link_to "#{location.name}"**,generate_location_url_with_prefix(location) %></li>**
<%end%>
</ul>
如果我删除**stars**
之间的代码,我可以使用它。但是,我无法弄清楚如何获取链接到每个单独位置页面的位置列表 - 我在**code marked like this**
中显示了我这样做的尝试。在关系/数据方面,数据库表肯定是可以设置好的。任何想法都受到了欢迎......
LocationsController:
class LocationsController < ApplicationController
before_filter :extract_location_name, :only => [:show_by_name]
def index
@location = Location.all
end
def show
@location = Location.find(params[:id])
end
def show_by_name
@location = Location.find_by_name(@location_name)
render :show
end
private
def extract_location_name
@location_name = params[:location_name_with_prefix].gsub(Location::ROUTE_PREFIX,"").gsub("-", " ").strip
end
end
end
答案 0 :(得分:1)
现在你有重叠的路线
get "/:county_name_with_prefix" => "counties#show_by_name"
get "/:location_name_with_prefix" => "locations#show_by_name"
这些是不明确的,因此第二个将覆盖第一个,导致所有这些路由到locations#show_by_name
。
这是因为Rails无法将/county_name_here
与/location_name_here
区分开来。这有意义吗?
当您使用named_route
创建as:
时,也无需创建生成路径的方法,这将生成使用as name plus _path进行路由的方法。例如as: :hello
将为hello_path
创建方法。
我会推荐像
这样的东西get "/counties/:county_name_with_prefix", to: "counties#show_by_name", as: :county_by_name
get "/locations/:location_name_with_prefix", to: "locations#show_by_name", as: :location_by_name
然后在您的视图中,您可以使用
<ul>
<% @locations.each do |location|%>
<li><%= link_to location.name,location_by_name_path(location_name_with_prefix: location.name) %></li>
<%end%>
</ul>
这将在链接中生成/locations/location_name_here
之类的路由,以便它们正常工作。
然而,您也可以将这些内容放在您的资源范围内,如下所示:
resources :counties do
get '/:county_name_with_prefix, to: 'counties#show_by_name', as: :by_name
resources :locations do
get '/:location_name_by_prefix', to: 'locations#show_by_name', as: :by_name
end
end
这会产生类似
的路线county_by_name GET /counties/:county_name_with_prefix counties#show_by_name
county_location_by_name GET /counties/:id/locations/:location_name_with_prefix locations#show_by_name
虽然当你可以使用嵌套资源的默认路由生成这样的链接时,所有这些似乎都是不必要的。例如
<li><%= link_to location.name,county_location_path(location) %></li>
这是因为您的嵌套资源已经创建了这条路线,如
county_location GET /counties/:county_id/locations/:id locations#show
会在:county_id
上拨打:id
和location
并转到类似
/counties/1/locations/12
答案 1 :(得分:0)
<%= link_to location.name, county_location_path(@county, location) %>