CartsController#destroy 中的 NoMethodError - 使用 Rails 4 进行敏捷 Web 开发

2023-12-02

我正在按照《Agile Web Development with Rails 4》一书学习 Rails,但遇到了这个错误:

NoMethodError in CartsController#destroy
undefined method `name' for nil:NilClass

这是购物车控制器的销毁操作。错误信息引用了该行@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

此操作是从“空车”按钮调用的views/carts/shown.html.erb

<%= button_to 'Empty cart', @cart, method: :delete, data: {confirm: 'Are you sure?'} %>

一切工作正常,但在创建添加列的迁移之后price到餐桌上LineItems并修改方法add_product from Carts为了处理这个新列,销毁操作不再起作用。

this is 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

This is models/line_item.rb:

class LineItem < ActiveRecord::Base
  belongs_to :product
  belongs_to :cart

  def total_price
    price * quantity
  end
end

这就是动作create from 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

在此操作之前,该方法set_cart从模块CurrentCart叫做:

def set_cart
  @cart = Cart.find(session[:cart_id])
  rescue ActiveRecord::RecordNotFound
  @cart = Cart.create
  session[:cart_id] = @cart.id
end

当我运行控制器测试时,没有出现任何故障。这是对动作的测试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

我不明白这个错误的原因是什么,我需要你的帮助。

edit

这是服务器的输出:

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'

谢谢 :)


从 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'

发生的事情是这样的/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根据这个GitHub问题.

我所做的是更新 Rails 版本。我正在使用rails 4.0.0,更新后rails 4.1.2问题解决了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CartsController#destroy 中的 NoMethodError - 使用 Rails 4 进行敏捷 Web 开发 的相关文章

  • Rails 3:用户创建自定义表单?

    我正在尝试思考如何允许用户创建具有所有字段类型的自定义表单 如果有一颗宝石那就太好了 但我似乎无法在任何地方找到它 所以我有一个像这样的数据库设置 t integer form id t string name t string hint
  • Rails 4 - 如何在开发中使用 sqlite3 以及在生产中使用 PostgreSQL 和 Heroku

    我正在尝试部署到 Heroku 但不能 因为默认的 sqlite3 服务器仍然存在 检测到 Heroku 不支持 sqlite3 gem https devcenter heroku com articles sqlite3 https d
  • DBNull 怎么会不等于 DBNull

    我有以下代码行 if DBNull Value Equals o o null where o is object o in row ItemArray我不断收到错误 gt Xml type List of xdt untypedAtomi
  • 为什么每个方法需要将其循环的值分配给变量?

    在 Rails 上工作 发现我对 Rails 的理解缺乏知识each method 不知道为什么each方法需要变量 message h2 h2 不确定为什么每个方法都需要变量 message 事实并非如此require它 你完全可以忽略它
  • 限制 has_many 关联中的对象数量

    我有一个相册 里面有很多照片 counter cache 设置会更新相册表中的 photos count 列 如何限制相册的照片数量 就我而言 使用就足够了validates length of class Album has many p
  • Rails 3 按字段排序和最后

    您好 我对 Rails 3 2 和订购有疑问 当想要按字段对集合进行排序时 调用时 last ActiveRecord行为怪异 gt gt User order FIELD id 1 User Load 0 4ms SELECT users
  • Sass::SyntaxError:找不到或无法读取要导入的文件:bootstrap-sprockets

    我在开发和生产部署中突然遇到此错误 自定义 css scss import bootstrap sprockets import bootstrap 错误 生产中 rake aborted Sass SyntaxError File to
  • Rails 5 - 在 gem 上充当 Taggable - 简单表单集合选择已定义的标签列表

    我正在尝试学习如何将 Acts as Taggable On gem 与 Rails 5 一起使用 我使用简单的表格作为表格 我认为部分问题是由于提案和 randd fields 之间的模型没有关联而产生的 我有名为 Proposal 和
  • 多步ActiveRecord的模型验证

    考虑具有以下字段的用户模型 名字 必填 姓氏 必填 电子邮件 必填 要求输入密码 电话 必填 大小 10 位数字 地址 必填 以及包含以下步骤的多步骤注册表单 第一步 包含 名字 姓氏 和 电子邮件 字段 第二步输入密码 电话和地址 您将如
  • 载波无法删除图像

    我现在使用 Carrierwave 上传图像 一切都很好 除了一个 当我添加用于删除上传图像的复选框时 我收到错误 无法批量分配受保护的属性 remove image Form Model class Manufacturer lt Act
  • Rails ActiveRecord:是否可以组合 :include 和 :conditions 查询?

    想象一下我有 wiki 文章 有很多修订 我想通过数据库使用 ActiveRecord 进行查询 该查询仅返回那些在过去 24 小时内更新过修订的文章 这样的事可能吗 我想它会是这样的 Articles find all include g
  • Ruby on Rails 和来自 PSP 的奇怪 HTTP_ACCEPT 标头

    我有 Ruby on Rails 应用程序 3 1rc4 并且每天使用相同的用户代理 Mozilla 4 0 PSP PlayStation Portable 2 00 都会不断遇到一些异常 例外 A ActionView MissingT
  • Rails 急切加载计数?

    使用 include 属性可以很好地进行预加载 Post find all include gt author 我想知道您是否也可以急切加载计数 例如我是否想获取每个帖子的评论数量 而不加载所有评论本身 也许像 Post find all
  • Rails 多租户架构,限制多个租户的访问范围

    目前我们有一个单租户数据库架构 MySQL 运行着超过 100 个数据库 我们使用 Apartment gem 切换子域上的数据库连接 一切都很顺利 然而 我们现在需要创建所谓的 伞 客户端 它可以访问一组现有客户端的所有数据 我不认为这对
  • 在 Rails 中强制内联渲染 PDF 文档

    我正在编写一个从一组 XML 文件生成 PDF 文件的服务 正在正确生成 PDF 但是 每次我单击 查看 PDF 链接时 浏览器都会要求用户下载 PDF 文件 我需要 PDF 内联显示 就像任何常规 HTML 页面一样 我虽然我写的代码是正
  • 对 Rails 3.1 中的特定路由强制使用 SSL

    我需要强制启用 SSL所有路线在我的申请中除了landing index In config application rb 我有 config force ssl true Then in landing controller rb 我有
  • 使用 Devise 和 Rails 从 Twitter Oauth 获取电子邮件

    我已经设置了一个基本的 Rails 应用程序来使用 twitter oauth gem 和设计 并且已经能够登录用户 但是 我的问题是我现在已将我的应用程序列入白名单 并且我想在响应中收到用户的电子邮件 我已遵循 Twitter 端的所有必
  • 将文件传递给活动作业/后台作业

    我通过标准文件输入接收请求参数中的文件 def create file params file upload Upload create file file filename img png end 但是 对于大型上传 我想在后台作业中执行
  • Rails escape_javascript 通过转义单引号创建无效的 JSON

    ActionView中的escape javascript方法转义撇号 作为反斜杠撇号 解析为 JSON 时会出错 例如 消息 我在这里 在打印时是有效的 JSON message I m here But 输出 I m here 导致无效
  • ActiveRecord 布尔验证接受非布尔值

    我正在尝试验证属性是否为布尔值 即 true 或 false 从我期望的 Rails 指南中 validates new out of stock inclusion in true false 可以工作 但它接受非布尔值 例如 Hi 作为

随机推荐

  • Android开发-getMenuInflater(R.menu.main, menu)

    我正在学习 android 并遵循简单的相机应用程序教程 我复制了一段代码 但出现错误 我不知道为什么 我正在使用的教程是 http iwearshorts com blog android development 102 代码片段是 Ov
  • Windows Phone 7 用户扩展属性

    被引导到这里后 http msdn microsoft com en us library microsoft phone info userextendedproperties getvalue 28v VS 92 29 aspx 我在侧
  • Azure Active Directory 发布注销 URL

    我希望在用户注销 Azure AD Office 365 时将他们重定向到我的应用程序网页 虽然根据来自的文档https greeneyeits com p 520 我们可以在那里编辑注销后链接 URL 并在用户注销 Azure AD Of
  • 如何在PowerShell中使用Windows API AuditEnumerateCategories函数?

    我想得到当前的高级安全审核策略使用 PowerShell 我可以用auditpol exe 但其输出因操作系统语言而异 这使得解析变得困难 The settings存储在 REG NONE 值中HKEY Local Machine Secu
  • 用于计算某些值在多行中出现的次数的 SQL 查询

    假设我有一个选举数据表 将其称为 选举 每次选举每个选民一行 如下所示 VoterID ElectionID A 1 A 2 B 1 C 2 D 3 E 1 E 2 我想知道在选举 1 和选举 2 中都投票的选民人数 我不关心其他人 该数字
  • 如何将 Laravel 变量传递到我的 AngularJS 视图中?

    我正在构建一个小型照片应用程序来学习 AngularJS 1 3 我有 PHP 背景 所以从概念上来说这对我来说是相当不同的 我想将一个变量 我的照片文件夹的 URL 传递到我的 AngularJS 视图 一个 html 文件 中 我怎样才
  • 更新站点时 git hook 出现问题

    我在服务器上建立了一个网站并使用git来维护它 为此 我创建了两个 git 存储库 其中一个位于 HOME site我推向一个非裸的 var www每次进行更改时都应该从裸存储库中提取 为了自动更新非裸存储库 我创建了一个并授予执行权限po
  • android 在 ndk/JNI 的 cc/c++ 中获取 IMEI

    我会尝试得到imei使用 C C 使用 ndk 获取设备的数据并使用 JNI 检索结果 const char res exec get out service call iphonesubinfo 3 在 shell 中工作 但在我的应用程
  • 如何进行git克隆并进入创建的目录

    How to git clone一个项目 然后cd一次进入新创建的目录 git clone http xxx optional folder name cd
  • Z3是否支持优化问题

    我在去年八月份的一篇文章中看到Z3不支持优化 但它也表示 开发人员正计划添加此类支持 我在来源中找不到任何表明发生这种情况的内容 谁能告诉我我关于没有支持的假设是否正确 或者是否已添加但我不知何故错过了它 谢谢 奥马尔 如果您的优化具有整数
  • 函数打印正确的输出和无

    我定义了这个函数 它接受一个单词和一串必需的字母 并且如果该单词至少使用一次所有必需的字母 则返回 True 当我运行它时 它给出了正确的输出 但我不明白为什么它也输出 无 这是我的代码 def uses all word allused
  • 在 Parse 中保存多个对象并接受超过 1 个 API 请求?

    据我从 Parse 文档可以看出堆栈溢出 the PFObject saveAllInBackground只需要 1 个 API 请求即可保存所有对象 我的方法保存一个对象 然后返回并saveAll还有 2 个物体 这看起来应该只需要 2
  • Android 操作栏中 Activity 的中心标题

    现在我的活动标题在左侧显示为 lt Title然后另一个菜单项显示在右侧 我想将标题居中并省略 lt 我怎么做 我正在使用典型的菜单 我称之为使用 public boolean onOptionsItemSelected MenuItem
  • 在 POI 中合并后为单元格设置值

    我想在 POI 中形成如下的 excel 输出 从图像中可以清楚地看出 我分别在 Header3 Header4 和 Header5 下各有 3 个子列 名单如下 ListA 包含 A 列的值 列表 包含 B 列的值 List1 是数据库行
  • 如何在 C++ 中对向量进行排序和排名(不使用 C++11)

    我正在尝试构建一个函数 它接受一个向量 对其进行排序 对其进行排序 并输出排序和排序的向量以及值的原始定位 例如 输入 10 332 42 0 9 0 输出 3 5 4 2 1 我使用了这个堆栈溢出question 特别是马吕斯的答案 作为
  • 使用自定义 DataAnnotationsModelValidatorProvider 进行服务器端验证

    我已经设置了一个自定义提供程序 以允许从数据存储而不是静态代码中设置验证属性 在我的 NET MVC 4 项目中与客户端验证配合得很好 但我无法让服务器端验证工作 CustomModelValidatorProvider cs public
  • 为什么我用 openssl 和 golang 生成的 RSA 签名不同?

    我使用 openssl 命令对消息 Test 进行签名 用 hexdump 输出 echo Test openssl rsautl inkey privite key sign hexdump 0000 09 1b ce e2 4b 69
  • 将 magnificPopup 与动态元素结合使用

    我有两张照片 都有 foto 类 在每张照片下我添加了一个按钮 允许我删除照片 但是 从 DOM 中删除照片后 我仍然可以在图库中打开照片 而不是像预期的那样是 1 张照片 而是右下角有 2 张照片中的 1 张 并且我仍然可以在 magni
  • 从 Python 脚本运行 PowerShell 函数

    我需要从 Python 脚本运行 PowerShell 函数 ps1 和 py 文件当前位于同一目录中 我要调用的函数位于PowerShell脚本中 我看到的大多数答案都是从 Python 运行整个 PowerShell 脚本 在本例中 我
  • CartsController#destroy 中的 NoMethodError - 使用 Rails 4 进行敏捷 Web 开发

    我正在按照 Agile Web Development with Rails 4 一书学习 Rails 但遇到了这个错误 NoMethodError in CartsController destroy undefined method n