2015-12-21 64 views
2

如何从link_to方法创建此格式的url /:category/:product/:item/在rails中创建规范的URL /:category /:product /:item/in rails 4

我已经试过这样:

parameters: {category: @category, product: @product, item: @item} 

= link_to "list", url_for(controller: "items", action: "list", params: parameters), 
    class: "button radius #{ additional_classes }", rel: "canonical" 

但它给了我这个网址:/list?product=a&category=b&item=c。我在得到其他格式

PS真正感兴趣的是:我使用的纤薄,但方式不HTML

+0

能否请你告诉你的路线文件你如何使用资源? – punitcse

回答

-1

尝试改变你这样的路线:

get '/:category/:product/:item/', 'items#list', :as => 'item_list' 

所以你会得到item_list_path,你可以像这样在链接中使用它。

= link_to "list", item_list_path(@category, @product, @item) 

但一定要按照它们在url中的顺序传递参数。

0

这样做:

#config/routes.rb 
resources :categories, path: "" do 
    resources :product, path: "" do 
    resources :item, path: "" 
    end 
end 

这将创建下列网址:url.com/:category_id/:product_id/:id

,您就可以使用以下link_to帮手:

<%= link_to @item.title, [@category, @product, @item] %> 

-

虽然它应该可以工作,但它是not recommended

资源永远不应嵌套超过1级。

因此,你不妨重构你的路由/基础设施,使你打电话item_id上述所有 - product & categories作为索引方法:

#config/routes.rb 
resources :categories, path: "", only: :index 
resources :products, only: :index do 
    resources :items 
end 

这将允许你打电话<%= link_to "Products", products_path %>获取产品清单,然后<%= link_to @item.id, products_item_path(@product, @item) %>获取特定项目。


您也不妨看看friendly_id

这将无助于你的路由(它驻留在你的模型) - 它基本上可以让你使用slugs识别您的资源(而不是id的)。

我可以更新答案,如果你想知道更多关于它;基本上它可以让你有喜欢的网址:

url.com/:category_id/:product_id/:item 
url.com/category-name/product-name/item-name 

友好ID

友好ID只是代替你的路由/ find方法与slug参数的时:id参数。要设置friendly_id,您基本上需要为模型添加slug属性(通过迁移),然后在模型本身中包含FriendlyID类。

这里是你怎么想设置它:

# config/routes.rb 
resources :categories, path: "" do 
    resources :subcategories, path: "" do 
    resources :products, path: "" # => http://url.com/:category_id/:subcategory_id/:product_id 
    end 
end 

必须注意的是,嵌套足智多谋的路线是深刻的是not recommended(我会离开它证明做什么)。

Rails将采取上述操作并创建一个路由帮助程序,如category_subcategory_product_path(:category, :subcategory, :product)

通过为这些值中的每一个传递对象,“裸”Rails将仅从它们推断出idFriendlyID(如果设置正确)应在所有这些模型中将id替换为slug列。

您需要设置它像下面这样:

# app/models/category.rb 
class Category < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :name, use: [:finders, :slugged] 
end 

# app/models/subcategory.rb 
class Subcategory < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :name, use: [:finders, :slugged] 
end 

# app/models/product.rb 
class Product < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :name, use: [:finders, :slugged] 
end 

这一点 - 如果迁移,每机型的包括一个slug列 - 让Rails的填充与slug对象的路径帮手。当然,这并不重要,如果你只是用肉眼值反正:

category_subcategory_product_path(@category.slug, @subcat.slug, @product.slug) 

关键是要处理的控制器蛞蝓。

您可以通过路由助手传递任何值(没有验证)。不同之处在于你如何在控制器管理传递的数据:

# app/controllers/products_controller.rb 
class ProductsController < ApplicationController 
    def show 
    @product = Product.find params[:id] #-> FriendlyID will automatically look up the slug if present 
    end 
end 
+1

嗨,理查德,是否有可能更新关于friendly_id部分的答案?这正是我所需要的 - 一个这样的网址:url.com/category/subcategory/product-name - 我还不知道如何做到这一点。 – mohnstrudel

+0

当然,让我这样做 –

+0

亲爱的理查德,我仍然在努力解决这个问题。如果你能帮助我和其他人,那真是太好了。 – mohnstrudel

0

我设法做一个合并来解决这个问题:

parameters: {category: @category, product: @product, item: @item}

= link_to "list", url_for(controller: "items", action: "list").merge(parameters), class: "button radius #{ additional_classes }", rel: "canonical"