0

不知道如何构图,所以这里......

我有以下 link_to 标签:

<%= link_to("My test title",{:controller=>"search", :action=>"for-sale", :title => listing.title, :search_term => search_term, :id=> listing.id}) %>

以及我的 routes.rb 文件中的以下自定义路由:

map.connect ':controller/:action/:title/search_item/:id', :controller=>'search', :action=>'for_sale' 

这会生成一个非常好的 SEO 友好 URL:

/search/for-sale/sometitle/searchterm/123456

如何从两者中删除 :action 参数,问题是当我取出 :action 选项并将我的 link_to 标记更改为:

<%= link_to("My test title",{:controller=>"search", :title => listing.title, :search_term => search_term, :id=> listing.id}) %>

和我的自定义路线:

map.connect ':controller/:title/search_item/:id', :controller=>'search', :action=>'for_sale' 

生成的 URL 不再对 SEO 友好而且非常难看:

/search?title=test&search_term=test&id=1141409

我的自定义路由重定向到控制器中的正确操作,因此 URL 中不需要操作选项。每当我删除 :action 选项或将其重命名为其他内容时 - URL 会“变形”,你知道我该怎么做吗?

尝试了多种选择,但似乎没有任何效果。

谢谢!

4

1 回答 1

3

首先,您的路线':controller/:title/search_item/:id'没有:search_term参数,但您试图将其传递给 link_to:search_term => search_term

其次,如果您一直使用控制器'search',则不需要将其作为参数传递。

所以,你的路线可能变成'search/:title/:search_term/:id'

另外,尝试使用命名路由:

map.search 'search/:title/:search_term/:id', :controller=>'search', :action=>'for_sale'

<%= link_to("My test title", search_path(listing.title, search_term, listing.id)) %>

编辑:可选参数

您可以在路由结束时为参数提供默认值。

所以,如果你设置

map.search 'search/:title/:search_term/:id', :controller=>'search', :action=>'for_sale', :id => nil, :search_term => nil

您可以创建没有 id 的 url:search_path(listing.title, search_term) 或者没有 id 和 search_term:search_path(listing.title)

如果您只想:search_term选择可选,请在路线末尾输入:

map.search 'search/:title/:id/:search_term', :controller=>'search', :action=>'for_sale', :search_term => nil
于 2010-04-27T22:05:30.160 回答