我正在尝试为我所拥有的“产品”模型制定一些更好的网址,仅限于展示动作。我目前正在使用friend_id来生成相当多的slug,这很好,但是如果可以的话,我正在尝试改进URL流程。
目前我的路径就像这样工作
example.com/products/pretty-url-slug
保存parictular产品(到产品型号)时,我还保存了type_of属性。哪个可能是android,iphone,windows
所以我试图最终拥有像这样的强大URLS
example.com/products/iphone/pretty-url-slug
问题是,我没有或者相信我想要一个真正的“iphone”,“android”等控制器。但我宁愿只更新路由的组合并显示动作来正确处理这个问题。
到目前为止,我试图通过在路由上使用catch all来解决这个问题,但是无法正常工作。是否有任何建议或不同方式来处理这个问题?
routes
resources :products
# at the bottom of my routes a catch all
match '*products' => 'products#show'
# match routes for later time to do something with to act like a
# normal category page.
match 'products/iphone' => 'products#iphone_index'
match 'products/android' => 'products#android_index'
match 'products/windows' => 'products#windows_index'
show action in the products controller
def show
# try to locate the product
if params[:product].present?
slug_to_lookup = params[:product].split("/").last
type_of = params[:product].split("/").second
@product = Product.find_by_slug(slug_to_lookup)
else
@product = Product.find_by_slug(params[:id])
end
# redirect if url is not the slug value
if @product.blank?
redirect_to dashboard_path
elsif request.path != product_path(@product)
redirect_to product_path(@product)
end
end
这种方式可以解决问题,但是我无法确定如何附加type_of属性并生成有效的URL。
答案 0 :(得分:1)
如何定义这样的路线:
此处,除了:controller或:action之外的任何内容都将作为params的一部分用于操作。
答案 1 :(得分:0)
感谢您的建议。当我想到它时,我实际上能够解决这个问题并且非常简单。这可能对其他人有帮助。
在我的路线中,我刚为我所拥有的每种类别创建了一条路线。所以每次新的类别,我都需要添加一条额外的路线,例如:
# match for each product category
match 'shop/iphone/:slug' => 'products#show', :as => :product_iphone
match 'shop/android/:slug' => 'products#show', :as => :product_android
match 'shop/windows/:slug' => 'products#show', :as => :product_windows
然后在产品的show动作中而不是指导,你只需渲染产品/展示slug是否与现有产品匹配
@product = Product.find_by_slug(params[:slug])
然后在您的观看中,您可以链接到这样的特定类别
link_to "product", product_android_path(@product)