0
votes

I want to create a submission model where a user can create submissions for tasks. Each submission should have a user_id and a task_id. When I try to create a submission, rails returns an error saying that the task must exist.

task model:

has_many :submissions

user model:

has_many :submissions

submission model:

belongs_to :user
belongs_to :task

routes:

resources :tasks do
  resources :submissions
end

submissions controller:

def create
  @task = Task.find(params[:task_id])
  @submission = current_user.submissions.build(submission_params)
  if @submission.save
    flash[:success] = "Submitted!"
    redirect_to task_submission_path(@task, @submission)
  else
    puts @submission.errors.full_messages
    render 'new'
  end
end

def new
  @task = Task.find(params[:task_id])
  @submission = Submission.new
end

def show
  @submission = Submission.find(params[:id])
end

private

  def submission_params
    params.require(:submission).permit(:description)
  end

tasks/show.html.erb:

<% if user_signed_in? %>
  <%= link_to "Submit", new_task_submission_path(@task) %>
<% end %>

submissions/new.html.erb:

<h2>Submit</h2>
<%= form_for [:task, @submission] do |f| %>
  <div><%= hidden_field_tag :task_id, @task.id %></div>
  <div class="field">
    <%= f.text_area :description, placeholder: "File description" %>
  </div>
  <%= f.submit "Submit", class: "btn btn-primary" %>
<% end %>

submission migration:

def change
  create_table :submissions do |t|
    t.string :description
    t.integer :user_id
    t.integer :task_id

    t.timestamps
  end
end
1

1 Answers

0
votes

You are not assigning the task, you are only finding it in your create method. Please do this instead:

def create
  @submission = current_user.submissions.build(submission_params)
  @submission.task = Task.find(params[:task_id])
  if @submission.save
    flash[:success] = "Submitted!"
    redirect_to task_submission_path(@task, @submission)
  else
    puts @submission.errors.full_messages
    render 'new'
  end
end

But Rails is able to perform this automatically, if you change the whitelisted params:

def create
  @submission = current_user.submissions.build(submission_params)
  if @submission.save
    flash[:success] = "Submitted!"
    redirect_to task_submission_path(@task, @submission)
  else
    puts @submission.errors.full_messages
    render 'new'
  end
end

private

def submission_params
  params.require(:submission).permit(:description, :task_id)
end