gaggina
gaggina

Reputation: 5425

Adding a form to a view gives me a routing issue

I've 3 controllers/models in my rails app: peppers events links

peppers model

has_many :events

events model

belongs_to :pepper

has_many :links

links model

belongs_to :event

route file

Peps::Application.routes.draw do

  resources :events do
    resources :links
  end

  resources :peppers do
    resources :events
  end

  resources :links

  resources :events

  resources :peppers
end

view

<p id="notice"><%= notice %></p>

<%= form_for([@pepper, @pepper.events.build]) do |f| %>

  <p>Titolo : <%= f.text_field :title %></p>
  <p>Note: <%= f.text_area :note %></p>
  <p><%= f.submit "Aggiungi evento" %></p>
<% end %>

<p>
  <b>Title:</b>
  <%= @pepper.title %>
</p>

<p>
  <b>Note:</b>
  <%= @pepper.note %>
</p>

<hr>

<% for event in @events %>
    <h3><%= event.title %></h3>
    <p><%= event.note %></p>

    <ul>
        <% for link in event.links %>
            <li><%= link.url %></li>
        <% end %>
    </ul>

    <%= link_to 'Cancella evento', link, confirm: 'Are you sure?', method: :delete %>
<% end %>

<%= link_to 'Edit', edit_pepper_path(@pepper) %> |
<%= link_to 'Back', peppers_path %>

This view work very well and no errors appears.

But if I add this form after the <ul> element

<%= form_for([event, event.links.build]) do |f| %>
            <p><%= f.text_field :url %></p>
            <p><%= f.submit "Aggiungi link" %></p>
<% end %>

I get this error

No route matches {:controller=>"links", :format=>nil, :event_id=>#<Event id: nil, title: nil, note: nil, created_at: nil, updated_at: nil, pepper_id: 4>}

What this error is for?

Upvotes: 0

Views: 35

Answers (1)

Ian Eccles
Ian Eccles

Reputation: 7365

Without seeing your controller code I can't be sure of this, but I suspect the issue is that @events is a Rails relation instead of a proper array. In your controller, if you have something like:

@events = @pepper.events

you will want to change that to:

@events = @pepper.events.all

to force @events to resolve to a concrete array. Otherwise, iterating over @events will include the empty event you built for your first form:

<%= form_for([@pepper, @pepper.events.build]) do |f| %>

If this does not solve your issue, please post the relevant controller code for this view.

Upvotes: 1

Related Questions