Rails говорит, что задача должна существовать при попытке создать представление - PullRequest
0 голосов
/ 19 мая 2019

Я хочу создать модель отправки, в которой пользователь может создавать представления для задач. Каждое представление должно иметь user_id и task_id. Когда я пытаюсь создать представление, rails возвращает ошибку, в которой говорится, что задача должна существовать.

модель задачи:

has_many :submissions

модель пользователя:

has_many :submissions

модель представления:

belongs_to :user
belongs_to :task

маршруты:

resources :tasks do
  resources :submissions
end

контроллер представлений:

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

задачи / show.html.erb:

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

материалы / 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 %>

миграция представления:

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

    t.timestamps
  end
end

1 Ответ

0 голосов
/ 19 мая 2019

Вы не назначаете задачу, вы только находите ее в своем методе создания. Пожалуйста, сделайте это вместо:

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

Но Rails может выполнить это автоматически, если вы измените белый список параметров:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...