【问题标题】:rails: nested resources saving empty recordsrails:嵌套资源保存空记录
【发布时间】:2018-09-14 06:06:58
【问题描述】:

我创建了一种简单形式的嵌套资源。我无法正确保存子表单 todo_item。当我单击“创建待办事项”按钮时,无论我在标题字段中输入什么内容,都会创建并保存一个空记录。

代码非常简单,父记录保存良好。子记录正在显示,所以我无法弄清楚可能出了什么问题。请帮忙。

我的模型:

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

查看.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 %>

【问题讨论】:

    标签: ruby-on-rails nested-resources


    【解决方案1】:

    你在这里初始化@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)
    

    也许您还应该添加一些验证,这样您就可以避免这种情况。

    【讨论】:

    • 我还没有添加参数。我正在将它们添加到 UI 上。我刚刚编辑了我的原始帖子以包含图片。当我点击 New Todo Item 时,会出现一个表单,我在其中输入值。它们不是由“新”方法提供的。
    • 查看create 操作,而不是new 操作。
    【解决方案2】:

    需要修改create方法:

    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
    

    结束

    【讨论】:

    • .create then if @todo_list.save 没有多大意义,不是吗?
    • 感谢 jvillian 和 Cryptex Technologies!我确实发现 Rails 逻辑很难遵循。也许只是需要习惯它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多