108*_*427 2 null ruby-on-rails nomethoderror ruby-on-rails-4
我正在学习Rails遵循"使用Rails 4进行敏捷Web开发"这本书,我遇到了这个错误:
NoMethodError in CartsController#destroy
undefined method `name' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
这是Cart控制器的动作Destroy.错误信息引用该行@cart.destroy if @cart.id == session[:cart_id]:
# DELETE /carts/1
# DELETE /carts/1.json
def destroy
@cart.destroy if @cart.id == session[:cart_id]
session[:cart_id] = nil
respond_to do |format|
format.html { redirect_to store_url,
notice: 'Your cart is currently empty'}
format.json { head :no_content }
end
end
Run Code Online (Sandbox Code Playgroud)
此操作是从"空车"按钮调用的 views/carts/shown.html.erb
<%= button_to 'Empty cart', @cart, method: :delete, data: {confirm: 'Are you sure?'} %>
Run Code Online (Sandbox Code Playgroud)
一切都运行正常,但在创建了一个将列添加price到表LineItems并add_product从修改Carts处理此新列的方法的迁移后,destroy操作不再起作用.
这是 models/cart.rb
class Cart < ActiveRecord::Base
has_many :line_items, dependent: :destroy
def add_product(product_id, product_price)
current_item = line_items.find_by(product_id: product_id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(product_id: product_id, price: product_price)
end
current_item
end
def total_price
line_items.to_a.sum { |item| item.total_price }
end
end
Run Code Online (Sandbox Code Playgroud)
这是models/line_item.rb:
class LineItem < ActiveRecord::Base
belongs_to :product
belongs_to :cart
def total_price
price * quantity
end
end
Run Code Online (Sandbox Code Playgroud)
这是动作create从line_items_controller一个用于将产品加入购物车:
before_action :set_cart, only: [:create]
...
# POST /line_items
# POST /line_items.json
def create
session[:counter] = 0
product = Product.find(params[:product_id])
@line_item = @cart.add_product(product.id, product.price)
respond_to do |format|
if @line_item.save
format.html { redirect_to @line_item.cart }
format.json { render action: 'show', status: :created, location: @line_item }
else
format.html { render action: 'new' }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
Run Code Online (Sandbox Code Playgroud)
在此操作之前,将调用set_cart模块中的方法CurrentCart:
def set_cart
@cart = Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
@cart = Cart.create
session[:cart_id] = @cart.id
end
Run Code Online (Sandbox Code Playgroud)
当我运行控制器测试时,没有失败.这是destroy购物车行动的测试:
test "should destroy cart" do
assert_difference('Cart.count', -1) do
session[:cart_id] = @cart.id
delete :destroy, id: @cart
end
assert_redirected_to store_path
end
Run Code Online (Sandbox Code Playgroud)
我看不出这个错误的原因是什么,我希望得到你的帮助.
编辑
这是服务器的输出:
Started DELETE "/carts/15" for 127.0.0.1 at 2015-02-16 12:23:43 -0500
Processing by CartsController#destroy as HTML
Parameters: {"authenticity_token"=>"hLsBQ0fR5b9M2lfxMc5McU1+dqtnZ2OKABRZV79vdHo=", "id"=>"15"}
Cart Load (0.2ms) SELECT "carts".* FROM "carts" WHERE "carts"."id" = ? LIMIT 1 [["id", "15"]]
(0.2ms) begin transaction
LineItem Load (0.9ms) SELECT "line_items".* FROM "line_items" WHERE "line_items"."cart_id" = ? [["cart_id", 15]]
SQL (0.5ms) DELETE FROM "line_items" WHERE "line_items"."id" = ? [["id", 91]]
(0.2ms) rollback transaction
Completed 500 Internal Server Error in 73ms
NoMethodError (undefined method `name' for nil:NilClass):
app/controllers/carts_controller.rb:58:in `destroy'
Run Code Online (Sandbox Code Playgroud)
谢谢 :)
108*_*427 10
从rails控制台尝试得到这个:
2.2.0 :001 > carro = Cart.find(25)
Cart Load (12.9ms) SELECT "carts".* FROM "carts" WHERE "carts"."id" = ? LIMIT 1 [["id", 25]]
=> #<Cart id: 25, created_at: "2015-02-17 01:10:49", updated_at: "2015-02-17 01:10:49">
2.2.0 :002 > carro.destroy
(0.2ms) begin transaction
/home/xx/.rvm/gems/ruby-2.2.0/gems/activerecord-4.0.0/lib/active_record/associations/has_many_association.rb:75: warning: circular argument reference - reflection
/home/xx/.rvm/gems/ruby-2.2.0/gems/activerecord-4.0.0/lib/active_record/associations/has_many_association.rb:79: warning: circular argument reference - reflection
/home/xx/.rvm/gems/ruby-2.2.0/gems/activerecord-4.0.0/lib/active_record/associations/has_many_association.rb:83: warning: circular argument reference - reflection
/home/xx/.rvm/gems/ruby-2.2.0/gems/activerecord-4.0.0/lib/active_record/associations/has_many_association.rb:102: warning: circular argument reference - reflection
LineItem Load (0.2ms) SELECT "line_items".* FROM "line_items" WHERE "line_items"."cart_id" = ? [["cart_id", 25]]
SQL (0.3ms) DELETE FROM "line_items" WHERE "line_items"."id" = ? [["id", 116]]
SQL (0.1ms) DELETE FROM "line_items" WHERE "line_items"."id" = ? [["id", 117]]
SQL (0.1ms) DELETE FROM "line_items" WHERE "line_items"."id" = ? [["id", 118]]
(0.2ms) rollback transaction
NoMethodError: undefined method `name' for nil:NilClass
from /home/xx/.rvm/gems/ruby-2.2.0/gems/activerecord-4.0.0/lib/active_record/associations/has_many_association.rb:80:in `cached_counter_attribute_name'
Run Code Online (Sandbox Code Playgroud)
根据这个GitHub问题,会发生什么/home/xx/.rvm/gems/ruby-2.2.0/gems/activerecord-4.0.0/lib/active_record/associations/has_many_association.rb:75: warning: circular argument reference - reflection错误.activerecord
我做的是更新rails版本.我正在使用rails 4.0.0,更新后rails 4.1.2问题解决了.
| 归档时间: |
|
| 查看次数: |
1430 次 |
| 最近记录: |