Search code examples
ruby-on-railssimple-formhas-manybelongs-to

Simple form for not working on belongs to


Hello I have a simple rails app that has two models a goal and a task

The goal has many tasks, and a task belongs to a goal.

For some reason, probably a rookie error, I cannot get the form to the task form to render with simple form.

Models

Goal

class Goal < ApplicationRecord
  has_many :tasks
end

Task

class Task < ApplicationRecord
  belongs_to :goal
end

Controllers

Goals

class GoalsController < ApplicationController
  before_action :set_goal, only: [:show]

  def show
  end

  private

  def set_goal
    @goal = Goal.find(params[:id])
  end
end

View views/goals/show

<div class="row">
  <%= @goal.title %> 
<div class="row">
  <ul>
    <% @goal.tasks.each do |task| %>
    <li><%= task.name %></li>
    <% end %>
  </ul>
  <%= render partial: 'tasks/form', locals: {comment: @goal.tasks.new} %>
</div>

Form views/tasks/_form

<%= simple_form_for([@goal, @task]) do |f| %>

  <div class="form-inputs">
    <%= f.input :name %>
    <%= f.input :description %>
  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

I get the error NoMethodError in Goals#show

so obviously I need to add the @task to my goals show.... but how

so I added to my goals show method

@task = Task.find_or_create_by(:task_id)

then i get the error

Unsupported argument type: task_id (Symbol)

so I added the following to my goals_controller

def show
  @task = Goal.task.find_or_create_by(:task_id)
end

but then I get

NoMethodError in GoalsController#show
undefined method `task' for #<Class:0x00007ff8c79b0920> Did you mean? take

Routes

Rails.application.routes.draw do
  resources :tasks
  resources :goals
end

Solution

  • As per Jagdeep's comment above adding Try adding @task = @goal.tasks.build in goals_controller#show fixed this issue.

    hope this helps