私が持っている「製品」モデルのより良いURLを作成しようとしていますが、ショーアクションのみです。私は現在、きれいなスラッグを生成するために friend_id を使用していますが、これは問題ありませんが、可能であれば URL フローを改善しようとしています。
現在、私のパスは次のように機能します
example.com/products/pretty-url-slug
特定の製品を (製品モデルに) 保存するとき、type_of 属性も保存します。Android、iPhone、Windowsのどれが可能性がありますか
だから私は最終的にこのような堅牢なURLを持とうとしています
example.com/products/iphone/pretty-url-slug
問題は、実際の「iphone」、「android」などのコントローラーを持っていない、または必要だと信じていないことです。しかし、ルートの組み合わせを更新し、アクションを表示して、これを適切に処理したいと思います。
これまでのところ、ルートでキャッチオールを使用してこれを解決しようとしましたが、正しく機能していません。これをエレガントに処理するための提案や別の方法はありますか?
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 を生成する方法がわかりません。