Routing issue

Hi!

I have two models, artists and songs.

I have this in my route file:
resources :artists, :path => “ackord” do
resources :songs
end

Which gives me urls like this (I’m using


to create and manage slugs):
example.com/ackord/artistname/songs/songname-id

Now I want to remove the /songs part to get a url like this:
example.com/ackord/artistname/songname-id

Is it possible? I have tried to do it with match without success.

Any ideas?

Best Regards
Linus

Any ideas anyone?

I tried this:

match ‘ackord/:artist_id/:id’ => ‘songs#show’, :as => :song

resources :artists, :path => “ackord” do
resources :songs
end

Which makes it work without the /songs/ part in the url at least for
the show action. It still works with the /song/ part though, which I
don’t want. Duplicate urls are not good :slight_smile:

Also, I have to create a match for each action with this approach. Is
there a better way to do this?

Best Regards
Linus

Excerpts from Linus P.'s message of Mon Mar 21 03:40:43 -0700
2011:

Which makes it work without the /songs/ part in the url at least for
the show action. It still works with the /song/ part though, which I
don’t want. Duplicate urls are not good :slight_smile:

Also, I have to create a match for each action with this approach. Is
there a better way to do this?

config/routes.rb

resources :artists, :path => ‘ackord’ do
resources :songs, :path => ‘’
end

rake routes

artist_song GET /ackord/:artist_id/:id(.:format)
{:action=>“show”, :controller=>“songs”}

Does this work for you Linus?

med vnlig hlsning
David J. Hamilton

Hi and thank you for your reply!

It kinda works… There is some issues though.

When I go to …/ackord/artist-name I want to load the artists show
action and inside this I loop out all the songs that’s related to the
artist.

When I go to this url now it load the songs index action instead. Its
because I have these two in my routes

artist_songs GET /ackord/:artist_id(.:format)
{:action=>“index”, :controller=>“songs”}
and
artist GET /ackord/:id(.:format)
{:action=>“show”, :controller=>“artists”}

Perhaps this is actually better and instead of showing the songs
inside artist#show I filter the songs and show them in songs#index
instead.

Any suggestions on either approach? Would it even matter? :slight_smile:

Best Regards
Linus

Thank you.

I’ll keep it like this for now :slight_smile:

Anyone else has any thoughts in this matter?

Best Regards
Linus

Excerpts from Linus P.'s message of Mon Mar 21 08:37:33 -0700
2011:

artist_songs GET /ackord/:artist_id(.:format)
{:action=>“index”, :controller=>“songs”}
and
artist GET /ackord/:id(.:format)
{:action=>“show”, :controller=>“artists”}

Perhaps this is actually better and instead of showing the songs
inside artist#show I filter the songs and show them in songs#index
instead.

Personally I think it’s fine for this logic to live in the songs
controller,
especially given that you’ve effectively namespaced the songs (by
artist) by
making it a nested resource.

That said, there is a bit of an ugliness in the route collision,
especially
since rails presumably doesn’t guarantee the how the collision is
resolved.

OTOH there’s a lot of ugliness in having to specify each route manually.
Unless
someone else on the list has a better suggestion than the one I offered,
you may
have to simply pick your poison.


med vnlig hlsning
David J. Hamilton

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs