2

I have a User model and Todo model. I want to be able to add multiple todos using a single form.

Routes:

# Users
  resources(:users) do
    resources(:todos)
  end

User model:

class User < ApplicationRecord
    has_many :todos
    ....

Todos controller:

class TodosController < ApplicationController

    def new
        @user = User.find(params[:id])
        @todos = Array.new(10) {@user.todos.build}
    end
    ....

View for todos/new:

<%= form_for([@user, :todos]) do |f| %>
    <% @todos.each do |todo| %>
        <%= f.text_field(:name, class: "form-control") %>
    <% end %>
    <%= f.submit "Save", class: "btn btn-primary" %>
<% end %>

What I get is:

undefined method `model_name' for :todos:Symbol

What am I doing wrong? I searched SO for doing multiple saves using one form, and I found this.

Community
  • 1
  • 1
mdmb
  • 4,833
  • 7
  • 42
  • 90

2 Answers2

1

I believe you are looking for nested forms.

In your model you will add

accepts_nested_attributes_for :todos

and in your view

    <%= form_for @user do |f| %>
  TODO:
  <ul>
    <%= f.fields_for :todo do |todo| %>
      <li>
        <%= todo.label :todo %>
        <%= todo.text_field :todo %>
      </li>
    <% end %>
  </ul>


    <%= f.submit "Save", class: "btn btn-primary" %>

<% end %>

in controller

def new
        @user = User.find(params[:id])
        10.times {@user.todos.build}
    end

for refference http://guides.rubyonrails.org/form_helpers.html#nested-forms

NOTE: this code is untested

Jon
  • 1,954
  • 1
  • 15
  • 13
0

In your view, try

<%= form_for([@user, @user.todos]) do |f| %>

I'm also new to ruby but hopefully it works.

Xhui
  • 11
  • 4