One of my routes is not working

I have a User model which has_many :portfolios and each Portfolio has_many :pictures. My routes look like this:

resources :users do

resources :portfolios do

resources :pictures

end

end

Then I try to create a new Portfolio like this:

<%= link_to “new portfolio…”, new_user_portfolio_path(current_user) %>

With a form like this:

<%= form_for [current_user, @portfolio], html: { class: “form_settings” } do |f| %>

<% end %>

But when I click on “new portfolio…” my URL says /users/12/portfolios/new and I get this error:

Routing Error

No route matches {:controller=>"pictures", :user_id=>#<User id: 12, name: "michael", password_digest: "d787f56b080945c1ec0b3343cbf962ca427bb8ef", remember_token: "dL4nPlt0E5azUMemNIvkdg", admin: false, created_at: "2013-03-03 01:18:19", updated_at: "2013-03-03 19:56:28">, :portfolio_id=>#<Portfolio id: nil, user_id: 12, name: nil, created_at: nil, updated_at: nil>}

Is that route in ‘rake routes’?

Ok, figured out a part of it. My layout file has a toolbar which looks like this:

<% current_user.portfolios.each do |portfolio| %>

  • <%= link_to portfolio.name, user_portfolio_path(current_user, portfolio) %>
  • <% end %>

  • <%= link_to "new portfolio...", new_user_portfolio_path(current_user) %>
  • Which works when I’m at /users/12 but it breaks when I go to /users/12/portfolios/new. So my question is why can’t I link to the show page of my portfolios from the new page?

    yes, I checked all my routes against ‘rake routes’

    From this it sounds like somewhere you're trying to link (or generate a form that posts to) the pictures for an unsaved portfolio. This doesn't work because te URL for that would have the portfolio id in it, but the portfolio in question doesn't have an id yet.

    Fred

    You know what, I posted the wrong error. The correct error is this:

    No route matches {:action=>"show", :controller=>"portfolios", :user_id=>
    

    What fixed it is this:

    link_to portfolio.name, user_portfolio_path(current_user, portfolio) unless portfolio.new_record?

    the unless portfolio.new_record? part. But I don’t understand why that fixed it?