ruby-on-rails - rails 上的 ruby : controller can't access newly added record

标签 ruby-on-rails ruby

我对 RoR 很陌生。一开始我用的是sqlite3数据库,后来迁移到mysql。在我向数据库中添加一条记录之前,我的应用程序一切正常。

我可以使用“irb”控制台更新我的新记录。 我的 Controller 中有一个函数是从更新记录的 python 脚本调用的。

函数如下:

# GET /dd_bots/update
# param name, att
def update
   obj = Object.all
   obj = obj.select{ |o| o.name == params[:name] }
   obj[0].update_attribute(:att, params[:att])
head :ok
end 

然而,此函数不会更新返回此错误的新添加的记录:NoMethodError (undefined method update_attribute' for nil:NilClass)

很明显记录好像没有找到...

你知道为什么会这样吗?

最佳答案

首先,不要调用您的模型 Object:这可能会产生灾难性的后果,因为 Object 是 Ruby 中几乎每个对象的基类。

其次,update_attributeobj 的第一个元素上被调用,它是一个数组。如果数组不包含任何元素,即如果没有名称与传递给 Controller ​​的名称参数相同的对象,则会出现该错误。

您可以通过一种不易出错的方式来执行此操作:

def update
  obj = Object.find_by_name(params[:name])
  obj.update_attribute(:att, params[:att]) if obj
  head :ok
end

如果一条记录应该存在,如果它不存在,您可能想抛出一个异常。您可以通过将 ! 添加到 find_by_name 方法来执行此操作:

obj = Object.find_by_name!(params[:name]) # Could throw an ActiveRecord::RecordNotFound

如果记录不存在,这样做的好处是给出 HTTP 404 状态代码,否则以相同的方式操作。

关于ruby-on-rails - rails 上的 ruby : controller can't access newly added record,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16544903/

相关文章:

ruby - 跟踪 Ruby 代码中的内存泄漏

ruby-on-rails - 如何使用 Net::HTTP (Rails) 发送完整的 POST 请求

ruby-on-rails - Rails 4 如何在列表中显示 belongs_to 记录

php - 如何将 PHP crypt 实现转换为 Ruby?

mysql - 在 RAILS 中查询比通过 Mysql 客户端查询花费的时间更长

ruby-on-rails - Rails 一直在源代码中启动终端类型?

ruby 和 "You must recompile Ruby with OpenSSL support or change the sources in your Gemfile"

ruby-on-rails - @@ 在 Ruby 中是什么意思?

ruby - 在 Ruby 中,循环中的返回值是什么?

javascript - 通过命名函数避免 CoffeeScript 中的重复代码