andywalt
andywalt

Reputation: 109

Cocoon link_to_add_association not working

Have followed video tutorials, searched over and over, don't get it. Would appreciate help.

My main issue is that the link_to_add_association isn't working and I keep getting a missing template error.

"ActionView::MissingTemplate in Applications#new"

It says: Missing partial applications/_question_fields, application/_question_fields with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in: * "/Users/AndyAir/projects/friends-app/app/views" * "/Users/AndyAir/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/devise-4.2.1/app/views"

model

class Application < ApplicationRecord
 belongs_to :user

 has_many :questions

 accepts_nested_attributes_for :questions, reject_if: :all_blank, allow_destroy: true

 validates :name, :description, presence: true
end

controller

class ApplicationsController < ApplicationController
 before_action :find_application, only: [:show, :edit, :update, :destroy]
 before_action :authenticate_user!

 def index
    @applications = Application.all.order("created_at DESC").limit(3)
 end

 def new    
  @application = Application.new
  @application.questions.build
 end

 def create
    @application = Application.new(application_params)

    if @application.save
        redirect_to @application
    else
        render 'new'
    end
 end

 def show
 end

 def edit
 end

 def update
    if @application.update(application_params)
        redirect_to @application
    else
        render 'edit'
    end
 end


 def destroy
    @application.destroy
    redirect_to root_path
 end

 private

 def find_application
    @application = Application.find(params[:id])
 end

 def application_params
    params.require(:application).permit(:name, :description, questions_attributes: [:id, :name, :_destroy])
 end

 def after_sign_out_path_for(resource_or_scope)
  redirect_to root_path
 end
end

views/applications/new

<%= form_for @application do |f| %>
    <% if @application.errors.any? %>
      <div id="errors">
        <p><%= @application.errors.count %> Prevented this application from saving</p>
        <ul>
          <% @application.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
          <% end %>
        </ul>
      </div>
    <% end %>
    <div class="field">
        <%= f.label :title %><br>
        <%= f.text_field :name, placeholder: "Name of Your Friend Test", class: "form-control" %><br>
        <%= f.label :description %><br>
        <%= f.text_field :description, placeholder: "Write a witty tagline for your test.", class: "form-control" %><br>
    </div>
    <h3>Questions</h3>
        <%= f.fields_for :questions do |question| %>
            <div id="questions">
                <div class="field">
                <%= render 'questions_fields', f: question %>
             <div class="links">
                <%= link_to_add_association 'Add Question', f, :questions %>
               </div>
              </div>
            </div>
        <% end %>
    <br>
    <div class="form-actions">
        <%= f.button :submit %>
    </div>
<% end %>

views/applications/_questions_fields.html.erb

<div class="nested-fields">
  <%= f.text_field :question %>
  <%= link_to_remove_association "remove task", f %>
</div>

Upvotes: 0

Views: 6391

Answers (2)

nathanvda
nathanvda

Reputation: 50057

Your view is named incorrectly for cocoon to deduce automatically. It is looking for _question_fields (singular) while you have _questions_fields.

Either you rename the partial (it only contains a single question, so imho it seems more logical), but you can also overrule the default partial name as follows:

<%= link_to_add_association 'Add Question', f, :questions, partial: 'questions_fields' %>

Upvotes: 2

Divya Sharma
Divya Sharma

Reputation: 556

Please try to take link_to_add_association out of fields_for.As there are no questions yet, the link_to_add_association is never shown.

<%= f.fields_for :questions do |question| %>
    <div id="questions">
        <div class="field">
            <%= render 'questions_fields', f: question %>
        </div>
    </div>
<% end %>
<div class="links">
    <%= link_to_add_association 'Add Question', f, :questions %>
</div>

Upvotes: 1

Related Questions