Rails update() 方法导致自定义 URL 错误

Posted

技术标签:

【中文标题】Rails update() 方法导致自定义 URL 错误【英文标题】:Rails update() method causing error for custom URL 【发布时间】:2014-08-23 21:48:30 【问题描述】:

我将为我的 Rails 应用程序创建自定义 URL。 到目前为止,我正在关注 Friendy URLs 文档,正如这里提到的 https://gist.github.com/jcasimir/1209730。

我已经用模型的属性(即:/books/the-lord-of-the-rings)替换了默认的 slug(即:/books/4)。在 book.rb 模型文件中:

# override to_param
# By default it returns the "slug" of the model
# (ie: @book.to_param => "1")
def to_param
  title.parameterize
end

因此,我重写了 Book.find() 方法,并在 book.rb 文件中重新定义。

# override find
# the "super" usage is Book.find(1) => object 1
# Now, it is Book.find("bookTitle") => object of that name
def self.find(input)
  find_by_title(input)
end

添加它是为了能够在不使用“slug”或我的模型 ID 的情况下找到我的模型。

当我尝试更新 Book 条目时出现问题。当@book.update(params[:book]) 被调用时,这是我从我的服务器得到的错误:

(0.2ms)  BEGIN
Book Exists (0.5ms)  SELECT 1 AS one FROM "books" WHERE ("books"."title" = 'nasty 22' AND "books"."id" != 62) LIMIT 1
Tag Load (0.6ms)  SELECT "tags".* FROM "tags" WHERE "tags"."book_id" = $1  [["book_id", 62]]
Book Load (1.3ms)  SELECT "books".* FROM "books" **WHERE "books"."title" = 62** LIMIT 1
PG::UndefinedFunction: ERROR:  operator does not exist: character varying = integer
LINE 1: ...CT  "books".* FROM "books"  WHERE "books"."title" = 62 LIMIT...

有问题的行是 WHERE "books"."title" = 62

不知何故,在更新方法的某个地方,它正在恢复尝试使用 ID 而不是标题来查找我的 Book 模型。

有谁知道如何解决这个问题? 非常感谢。

【问题讨论】:

【参考方案1】:

如果您继续按照要点中的说明进行操作,它将解决您的问题。您将不得不处理其他调用者将通过整数 id 调用 Book.find 的事实,因此您需要处理这两种情况。因此,您需要检查确定传递的参数是整数 ID 还是标题,然后调用适当的 find 方法(分别为 super 或 find_by_title)。我认为它不会以任何其他方式起作用,并且 find 是一种非常基本的方法。

【讨论】:

哇!我不敢相信我是多么愚蠢哈哈。我假设我的控制器的 Book.find() 调用将是唯一存在的。但是在这种情况下,如果我的标题是“123”,一个包含数字的字符串,它不会将其视为整数!我忽略了这一点 是的,你最好的方法可能是他们正在做的事情,让 URL 更像 /books/123-the-lord-of-the-rings,只是因为有可能两本书有同名。或者,您可以在多个标题匹配的情况下显示消歧页面,然后根据 ID 进行路由以确保匹配。

以上是关于Rails update() 方法导致自定义 URL 错误的主要内容,如果未能解决你的问题,请参考以下文章

Rails 6 - 加载自定义 JS 文件的正确方法是啥?

Rails:电子邮件“deliver_”方法的自定义模板?

如何覆盖自定义管理器类中的 .update() 方法

ruby on rails f.select 具有自定义属性的选项

自定义 rails 配置部分

Rails 中的自定义错误页面?