【问题标题】:Rails4 model ignores parent_id on 'create' actionRails4 模型在“创建”操作时忽略 parent_id
【发布时间】:2014-04-16 12:16:23
【问题描述】:

我有属于类别的子类别。我的应用程序在 id = 1 的子类别下保存(构建)我的所有子类别,即使我的代码似乎没问题并且不应该这样做:

子类别控制器:

    def create
      @category = Category.find_by(params[:id])
      @subcategory = @category.subcategories.build(subcategory_params)
      if @subcategory.save
        flash[:success] = "added subcategory"
        redirect_to admin_categories_url
      else
        render :new
      end
    end

...

    private

      def subcategory_params
        params.require(:subcategory).permit(:name, :category_id)
      end  

子类别.rb

class Subcategory < ActiveRecord::Base
  belongs_to :category
  has_many :products

  validates :name, presence: true
  validates :category_id, presence: true
end

表格:

<h3>Add a subcategory</h3>

<%= form_for [@category, @subcategory] do |f| %>
  <%= f.text_field :name, placeholder: "Name" %>
  <%= f.submit "Add a subcategory" %>
<% end %>

路由器:

resources :categories do
    resources :subcategories
  end

网址:

向 id = 3 的类别添加新的子类别

http://localhost:3000/categories/3/subcategories/new

日志:

Started POST "/categories/1/subcategories" for 127.0.0.1 at 2014-04-16 16:04:47 +0400
Processing by SubcategoriesController#create as HTML
  Parameters: {"utf8"=>"✓", authenticity_token"=>"74U3VyAN6NqEjhkuHGNHnPda/yzpc+dIcn2xBJ6Zi2A=", "subcategory"=>{"name"=>"A name"}, "commit"=>"Add subcategory", "category_id"=>"1"}
  User Load (0.2ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  Category Load (0.2ms)  SELECT  "categories".* FROM "categories"  WHERE "categories"."id" = $1 LIMIT 1  [["id", 1]]
   (0.1ms)  BEGIN
  SQL (0.2ms)  INSERT INTO "subcategories" ("category_id", "created_at", "name", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["category_id", 1], ["created_at", "2014-04-16 12:04:47.151729"], ["name", "A name"], ["updated_at", "2014-04-16 12:04:47.151729"]]
   (0.8ms)  COMMIT

ID 为 1

这可能是什么问题?

更新

做的时候

@category = Category.find_by(params[:category_id])

出现此错误:

ERROR:  argument of WHERE must be type boolean, not type integer
LINE 1: SELECT  "categories".* FROM "categories"  WHERE (1) LIMIT 1

如果这样做

@category = Category.find(params[:category_id])

问题存在

【问题讨论】:

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


    【解决方案1】:

    在您的 create 操作中,您选择的是子类别的 ID,而不是类别。将其更改为:

    def create
      @category = Category.find(params[:category_id])
      ...
    

    也需要在new 方法中对设置@category 进行相同的更改,以便category_id 在视图的参数中返回为3。当然,这种复制也可以使用控制器中的辅助方法进行干燥。

    要查看 id 的差异,您可以使用rake routes,您应该会看到如下内容:

    new_category_subcategory   GET   /categories/:category_id/subcategories/new   subcategories#new
    

    这表明它需要参数 category_id 作为类别 ID。

    【讨论】:

    • 得到一个错误:错误:WHERE 的参数必须是布尔类型,而不是整数第 1 行:SELECT "categories".* FROM "categories" WHERE (1) LIMIT 1
    • 对不起,应该是find 而不是find_by
    • 您还需要对 new 模型中的 @category 设置进行相同的更改,以便 category_id 在视图中的参数中返回为 3。
    • 没问题 :) 很抱歉我的原始答案中有几个错误。
    【解决方案2】:

    看看你的参数是category_id而不是id

     Parameters: {"utf8"=>"✓", authenticity_token"=>"74U3VyAN6NqEjhkuHGNHnPda/yzpc+dIcn2xBJ6Zi2A=", "subcategory"=>{"name"=>"A name"}, "commit"=>"Add subcategory", "category_id"=>"1"}
    

    #=> "category_id"=>"1"

       Category.find_by(category_id: params[:category_id]) 
    

    所以你需要这样做

     def create
      @category = Category.find_by(category_id: params[:category_id])
      @subcategory = @category.subcategories.build(subcategory_params)
      if @subcategory.save
        flash[:success] = "added subcategory"
        redirect_to admin_categories_url
      else
        render :new
      end
    end
    

    【讨论】:

    • 如果我这样做,我得到一个错误:错误:WHERE 的参数必须是布尔类型,而不是整数 LINE 1: SELECT "categories".* FROM "categories" WHERE (1) LIMIT 1
    • params.require(:subcategory).permit(:name, :category_id) 应该是params.require(:subcategory).permit(:name)
    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 2010-10-25
    • 1970-01-01
    • 2022-01-22
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    相关资源
    最近更新 更多