рельсы: вложенные ресурсы, сохраняющие пустые записи - PullRequest
0 голосов
/ 14 сентября 2018

Я создал простую форму вложенных ресурсов.Я не могу получить дочернюю форму todo_item для правильного сохранения.Когда я нажимаю кнопку «Создать элемент todo», будет создана и сохранена пустая запись, независимо от того, что я поместил в поле заголовка.

Код действительно прост, и родительская запись сохраняется нормально.отображаются дочерние записи, поэтому я не могу понять, что может быть не так.Пожалуйста, помогите.

Мои модели:

class TodoItem < ActiveRecord::Base
  belongs_to :todo_list
end

class TodoList < ActiveRecord::Base
  has_many :todo_items, dependent: :destroy
end

Мои контроллеры:

class TodoItemsController < ApplicationController
  before_action :set_todo_list
  before_action :set_todo_item, only: [:show, :edit, :update, :destroy]

  def new
    @todo_item = @todo_list.todo_items.new
  end

  def create
    @todo_item = @todo_list.todo_items.new

    respond_to do |format|
      if @todo_list.save
        format.html { redirect_to @todo_list, notice: 'Todo item was successfully created.' }
        format.json { render :show, status: :created, location: @todo_list }
      else
        format.html { render :new }
        format.json { render json: @todo_list.errors, status: :unprocessable_entity }
      end
    end
  end

  private

    def set_todo_item
      @todo_item = @todo_list.todo_items.find(params[:id])
    end

    def set_todo_list
      @todo_list = TodoList.find(params[:todo_list_id])
    end

    def todo_item_params
      params.require(:todo_item).permit(:title, :due_date, :description, :text, :completed)
    end

end

View.html.erb:

<h1>New Todo Item</h1>

<%= render 'form' %>

<%= link_to 'Back', @todo_list %>

_form.html.erb:

<%= form_for([@todo_list, @todo_item]) do |f| %>
 ...

  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

enter image description here

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вам необходимо изменить метод создания:

def create
@todo_item = @todo_list.todo_items.create(todo_item_params)

respond_to do |format|
  if @todo_list.save
    format.html { redirect_to @todo_list, notice: 'Todo item was successfully created.' }
    format.json { render :show, status: :created, location: @todo_list }
  else
    format.html { render :new }
    format.json { render json: @todo_list.errors, status: :unprocessable_entity }
  end
end

end

0 голосов
/ 14 сентября 2018

Вы инициализируете @todo_item здесь:

def create
  @todo_item = @todo_list.todo_items.new # <===== INITIALIZED HERE

  respond_to do |format|
    if @todo_list.save # <===== SAVED HERE WITHOUT EVER ASSIGNING VALUES.
      format.html { redirect_to @todo_list, notice: 'Todo item was successfully created.' }
      format.json { render :show, status: :created, location: @todo_list }
    else
      format.html { render :new }
      format.json { render json: @todo_list.errors, status: :unprocessable_entity }
    end
  end
end

Но не предоставляйте никаких аргументов new. Итак, новая запись не имеет значений.

Вместо этого, сделайте что-нибудь более похожее на:

@todo_item = @todo_list.todo_items.new(todo_item_params)

Возможно, вам также следует добавить некоторые проверки, чтобы избежать этой ситуации.

...