如何使用Rails 4以编辑形式创建关联模型?

时间:2015-01-12 05:53:35

标签: ruby-on-rails ruby forms ruby-on-rails-4 nested-attributes

我正在开发一个简单的应用程序,我有以下模型。

档案:

# app/models/item.rb
class Item < ActiveRecord::Base
  belongs_to :category

  accepts_nested_attributes_for :category
end

分类

# app/models/category.rb
class Category < ActiveRecord::Base
  has_many :items
end

我要做的是创建/更新项目。我有这个控制器和表单设置。

# app/controller/items_controller.rb
class ItemsController < ApplicationController
  # GET #create
  def new
    @item = Item.new
  end

  # POST #create
  def create
    @item = Item.new ItemParams.build(params)

    if @item.save
      redirect_to @item
    else
      render action: 'new'
    end
  end

  # GET #update
  def edit
    @item = Item.find(params[:id])
  end

  # PATCH #update
  def update
    @item = Item.find(params[:id])

    if @item.update(ItemParams.build(params))
      redirect_to @item
    else
      render action: 'edit'
    end
  end

  class ItemParams
    def self.build(params)
      params.require(:item).permit(:name, :category_id, category_attributes: [:id, :name])
    end
  end
end

表格部分:

# app/views/_form.html.haml
= form_for @item do |f|
  = f.text_field :name

  = f.label :category
  = f.collection_select :category_id, Category.all, :id, :name, { include_blank: 'Create new' }

  = f.fields_for :category do |c|
    = c.text_field :name, placeholder: 'New category'

  = f.submit 'Submit'

您会注意到,在表单中,我有一个选择字段和一个文本框。我想要做的是如果用户在选择字段中选择“新类别”并在文本字段中输入新类别的名称,则创建一个新类别。

如果设置正确,我应该可以从编辑表单创建新类别或更改类别。但是,当我尝试更新现有项目时,我收到此错误。

ActiveRecord::RecordNotFound - Couldn't find Category with ID=1 for Item with ID=1:

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:1)

您必须在new操作中加载类别:

def new
 @item = Item.new
 @item.build_category
end

为了使其适用于edit部分,我建议您将类别对象添加到fields_for助手中,如下所示:

f.fields_for :category, @item.category do |c|
 ...

希望这有帮助!