更新嵌套表单的属性

时间:2015-11-24 09:56:10

标签: ruby-on-rails-3 ruby-on-rails-4

您好我正在创建一个在线零售店。

我有Category模型和Sizes模型。它们嵌套在一个表单中。当我创建类别I时,也会为该类别创建大小。

现在我可以创建一个类别和尺寸。但是,我无法以嵌套形式更新尺寸。

因此,单击编辑类别并更​​改一个大小的名称,然后单击更新。我得到以下错误。在屏幕上它只是说"已经被拍摄"。

如何通过此嵌套表单更新尺寸?     /Users/Documents/Safsy/Website/Safsy/Safsy/app/controllers/categories_controller.rb @ line 40 CategoriesController#update:

    39: def update
 => 40:   binding.pry
    41:   if @category.update(category_params)
    42:      redirect_to @category
    43:      flash[:success] = 'Category was successfully updated.'
    44:   else
    45:     render "edit"
    46:   end
    47: end

[1] pry(#<CategoriesController>)>
Unpermitted parameters: _destroy, id
Unpermitted parameters: _destroy, id
Unpermitted parameters: _destroy, id
Unpermitted parameters: _destroy, id
Unpermitted parameters: _destroy, id
Unpermitted parameters: _destroy, id
Unpermitted parameters: _destroy, id
Unpermitted parameter: _destroy
Unpermitted parameter: _destroy
Unpermitted parameter: _destroy
Unpermitted parameter: _destroy
Unpermitted parameter: _destroy
Unpermitted parameter: _destroy
Unpermitted parameter: _destroy
   (0.1ms)  begin transaction
  Category Load (0.1ms)  SELECT  "categories".* FROM "categories" WHERE "categories"."id" = ? LIMIT 1  [["id", 64]]
  Size Exists (0.1ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'XSmall' LIMIT 1
  Size Exists (0.1ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'Small' LIMIT 1
  Size Exists (0.1ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'Medium' LIMIT 1
  Size Exists (0.1ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'Large' LIMIT 1
  Size Exists (0.1ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'XL' LIMIT 1
  Size Exists (0.1ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'XXL' LIMIT 1
  Size Exists (0.1ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'XXXL' LIMIT 1
  CACHE (0.0ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'XSmall' LIMIT 1
  CACHE (0.0ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'Small' LIMIT 1
  CACHE (0.0ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'Medium' LIMIT 1
  CACHE (0.0ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'Large' LIMIT 1
  CACHE (0.0ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'XL' LIMIT 1
  CACHE (0.0ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'XXL' LIMIT 1
  Size Exists (0.1ms)  SELECT  1 AS one FROM "sizes" WHERE "sizes"."title" = 'XXXL test' LIMIT 1
  Category Exists (0.1ms)  SELECT  1 AS one FROM "categories" WHERE ("categories"."name" = 'Shorts' AND "categories"."id" != 68) LIMIT 1
   (0.1ms)  rollback transaction

类别模型:

class Category < ActiveRecord::Base
  has_ancestry

  has_many :products
  has_many :sizes

  validates :name, presence: true, length: { maximum: 20 }, uniqueness: true

  accepts_nested_attributes_for :sizes, allow_destroy: true
end

尺寸模型:

class Size < ActiveRecord::Base
    validates :title, presence: true, length: { maximum: 15 }
    validates :title, uniqueness: true

  belongs_to :category
end

类别控制器:

class CategoriesController < ApplicationController
  before_action :set_category,   only: [:show, :edit, :update]
  before_action :admin_user,     only: [:destroy, :index, :edit, :show]

  def index
    @categories = Category.all
  end

  def show
    @tags = Product.where(category_id: @category.id).tag_counts_on(:tags)
    if params[:tag]
      @products = Product.tagged_with(params[:tag])
    else
      @products = Product.where(category_id: @category.id).order("created_at DESC")
    end
  end

  def new
    @category = Category.new
    3.times do
      @category.sizes.build
    end
  end

  def edit
  end

  def create
    @category = Category.new(category_params)
    if @category.save
      redirect_to @category
      flash[:success] = "You have created a new category"
    else
      flash[:danger] = "Your category didn't save"
      render "new"
    end
  end

  def update
    binding.pry
    if @category.update(category_params)
       redirect_to @category
       flash[:success] = 'Category was successfully updated.'
    else
      render "edit"
    end
  end

  def destroy
    category = Category.find(params[:id])
    category.sizes.destroy_all
    category.destroy
    flash[:success] = "Category deleted"
    redirect_to categories_path
  end

  private

  def set_category
    @category = Category.find(params[:id])
  end

  def category_params
    params.require(:category).permit(:name, :parent_id, size_ids: [], sizes_attributes: [:title])
  end
end

尺寸控制器:

class SizesController < ApplicationController
  before_action :logged_in_user, only: [:create, :index, :destroy, :update]
  before_action :admin_user, only: [:create, :index, :destroy, :update]

  def create
    @size = Size.create(size_params)
  end

  def index
    @sizes = Size.all
  end

  def destroy
    Size.find(params[:id]).destroy
  end

  def update
    @size.update_attributes(size_params)
  end

  private

  def size_params
    params.require(:size).permit(:title, :category_id)
  end
end

以下是分类更新方法中的参数:

    39: def update
 => 40:   binding.pry
    41:   if @category.update(category_params)
    42:      redirect_to @category
    43:      flash[:success] = 'Category was successfully updated.'
    44:   else
    45:     render "edit"
    46:   end
    47: end

[1] pry(#<CategoriesController>)> params
=> {"utf8"=>"✓",
 "_method"=>"patch",
 "authenticity_token"=>"ZHuWURBwIctFJLgZ1HGNeKvGpK8LlgH9S6Mrh7No/CFdjtwNFoNtfi9NIVHBVhApYH/U5tuOzV0eqhSq/95SCw==",
 "category"=>
  {"name"=>"Shorts",
   "parent_id"=>"64",
   "sizes_attributes"=>
    {"0"=>{"title"=>"XSmall", "_destroy"=>"false", "id"=>"21"},
     "1"=>{"title"=>"Small", "_destroy"=>"false", "id"=>"22"},
     "2"=>{"title"=>"Medium", "_destroy"=>"false", "id"=>"23"},
     "3"=>{"title"=>"Large", "_destroy"=>"false", "id"=>"24"},
     "4"=>{"title"=>"XL", "_destroy"=>"false", "id"=>"25"},
     "5"=>{"title"=>"XXL", "_destroy"=>"false", "id"=>"26"},
     "6"=>{"title"=>"XXXL test", "_destroy"=>"false", "id"=>"27"}}},
 "commit"=>"Update Category",
 "controller"=>"categories",
 "action"=>"update",
 "id"=>"68"}

1 个答案:

答案 0 :(得分:2)

允许嵌套表单的_destroy和id如下: -

def category_params
    params.require(:category).permit(:name, :parent_id, size_ids: [], sizes_attributes: [:id, :title, :_destroy])
end