为什么Rails在向我的模型添加dependent :: nullify之后抛出错误?

时间:2016-08-14 00:55:24

标签: ruby-on-rails

我有一个类别,其中包含许多产品和属于类别的产品。当我删除一个类别时,我想让Product的category_id属性为空或为零。

我尝试通过在我的Category模型中将dependent :: nullify添加到我的has_many方法来实现此目的:

class Category < ActiveRecord::Base
  validates :name, :presence => true
  validates :name, :length => { in: 4..16 }

  has_many :products, dependent: :nullify
end

我现在在尝试销毁对象时遇到此错误:

undefined method `name' for nil:NilClass

和better_errors引用我的destroy方法作为问题,但它在我添加dependent :: null之前工作正常,这是方法:

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

    if @category.destroy
      flash[:success] = "Category was successfully destroyed"
      redirect_to categories_path 
    else
      flash[:error] = "Could not delete Category"
      redirect_to :back
    end
end

在我添加dependent :: nullify选项之前,它删除了记录。

以下是我的类别和产品架构:

create_table "categories", force: true do |t|
    t.string   "name",        null: false
    t.text     "description"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

create_table "products", force: true do |t|
    t.string   "name",                                null: false
    t.string   "sku",                                 null: false
    t.text     "description"
    t.decimal  "price",       precision: 8, scale: 2, null: false
    t.integer  "category_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "products", ["name"], name: "index_products_on_name", using: :btree
  add_index "products", ["sku"], name: "index_products_on_sku", unique: true, using: :tree

产品不禁止category_id为空,所以我不认为这是问题所在。

这是我的产品型号:

class Product < ActiveRecord::Base
  belongs_to :category
end

在我的类别/ show.html.erb中,我使用名称方法,如下所示:

<div class="row">
  <div class="col-xs-12">
    <h1><%= @category.name %></h1>
  </div>
</div>

在我的categories / index.html.erb中我也使用了name方法一次:

<div class="col-xs-8 col-xs-offset-1">
    <% @categories.each do |category| %>
      <h2><%= category.name %></h2>
      <p><%= category.description %></p>
      <p><%= link_to "Show", category_path(category.id) %>, <%= link_to "Edit", edit_category_path(category.id) %>, <%= link_to "Delete", category_path(category.id), method: "delete", data: { confirm: "Are you sure?"}  %></p>

    <% end %>
</div>

在这两种观点中,我都不应该使用零类别吗?我不认为这是错误所引用的内容,因为我在控制台中也遇到了相同的错误,而且观点也没有发挥作用。

我不确定问题是什么。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

使用nullify:

它会将category_id设置为null,并且您在其中调用product.category.name的位置可能会出现此类错误Undefined method name for nil:Class。这是因为没有产品类别,product.category返回nil。因此,您需要相应地修改代码。

希望有所帮助

答案 1 :(得分:0)

我刚刚通过在我的Gemfile中将rails更新到版本4.2.6来解决了这个问题。它以前是4.1版。