不确定如何构建这一点,所以这里......
我有以下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 param,问题出在我取出:action选项&amp;将我的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'
生成的网址不再是SEO友好且非常难看:
/search?title=test&search_term=test&id=1141409
我的自定义路由重定向到控制器中的正确操作,因此不需要在URL中使用操作选项。任何时候我删除或重命名:action选项到其他东西 - URL变得“扭曲”,你知道我该怎么做吗?
尝试过多种选择,但似乎没有任何效果。
谢谢!
答案 0 :(得分: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的网址: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