Question

Here is my link_to

<%= link_to sub_category.name, controller: :posts, action: :product, id: "#{sub_category.slug}-#{sub_category.id}" %>

Which is pointing to the url

http://localhost:3000/posts/product/fifith-category-s-sub-category-2

I need the url as follows

http://localhost:3000/fifith-category-s-sub-category-2

How can i do it.

my route.rb

resources :posts
match ':controller(/:action(/:id))(.:format)', via: [:get,:post]
Was it helpful?

Solution

what @MarekLipka suggests is correct but defining your routes like this will take up all the single level namespace in your app i.e. "/anything" will route by default to posts#product.

I recommended using some form of identifier to figure out which routes should go to posts#product. What will work for you depends on why you want to do this. Couple of options are:

Use a short namespace:

scope '/pp' do 
    get ':id', to: 'posts#product
end
# "/pp/:id" routes to 'posts/product'
# pp is a random short name I picked, it could be anything

# link
<%= link_to sub_category.name, "pp/#{sub_category.slug}-#{sub_category.id}" %> 

Use a constraint:

get ':id', to: 'posts#product`, constraints: { :id => /sub\-category/ }
# only id's with 'sub-cateogry' route to 'posts/product'

# link (assuming that sub_category.slug has 'sub-category' words in it)
<%= link_to sub_category.name, "#{sub_category.slug}-#{sub_category.id}" %>  

OTHER TIPS

If you want path /:id match your posts#product, you should have something like this in your routes:

resources :posts
match ':id', to: 'posts#product`, via: :get
match ':controller(/:action(/:id))(.:format)', via: [:get, :post]
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top