我有一个类别,其中包含许多产品和属于类别的产品。当我删除一个类别时,我想让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>
在这两种观点中,我都不应该使用零类别吗?我不认为这是错误所引用的内容,因为我在控制台中也遇到了相同的错误,而且观点也没有发挥作用。
我不确定问题是什么。谢谢你的帮助。
答案 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版。