代码之家  ›  专栏  ›  技术社区  ›  Jason

如何从Rails链接中删除操作参数以运行?

  •  0
  • Jason  · 技术社区  · 15 年前

    不知道如何构建这个框架,所以这里……

    我有以下链接要标记:

    <%= 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("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会被“扭曲”,您知道我如何做到这一点吗?

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

    谢谢!

    1 回复  |  直到 15 年前
        1
  •  3
  •   Tatjana N.    15 年前

    首先,你的路线 ':controller/:title/search_item/:id' 没有 :search_term 参数,但您正在尝试将其传递到 :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_path(listing.title)

    如果你只想 搜索术语 可选,在路线末端放入:

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