0

如何为新模型创建带有 id 的永久链接?

例如

animal = Animal.create(name: 'cool dog') #creates animal with id of 1 and name of dog

animal.permalink => "1-cool-dog"

如何添加正确的回调以便插入 id?before_saveafter_save不起作用

after_save :update_permalink #or before_save

def update_permalink
  self.permalink = "#{id} #{name}".parameterize
end

最终发生的是我得到“cool-dog”而不是“1-cool-dog”

我明白为什么。它设置了一个属性而不将其保存在 after_save 上。但是在 before_save 上也不起作用,因为 id 尚未在新记录上创建。

4

2 回答 2

1

也许您根本不需要将永久链接保存到数据库。

def permalink
  "#{self.id} #{self.name}"
end

这种方法将通过在每次读取永久链接时连接 id 和名称来向模型添加一个永久链接。

于 2013-06-22T02:01:20.403 回答
1

根据http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

您应该使用 after_commit 而不是 after_save

保存和销毁都包含在事务中,以确保您在验证或回调中所做的任何事情都将在其受保护的范围内发生。因此,您可以使用验证来检查事务所依赖的值,或者您可以在回调中引发异常以进行回滚,包括 after_* 回调。

因此,在操作完成之前,您的连接之外不会看到对数据库的更改。例如,如果您尝试在 after_save 中更新搜索引擎的索引,则索引器将看不到更新的记录。after_commit 回调是唯一在提交更新后触发的回调。见下文。

正如我在上面评论的那样,您可能希望像这样简单地覆盖 Animal 模型的 to_param 方法。

def to_param
  "#{id}-#{name.parameterize}"
end

这将使您的所有网址自动像您尝试创建的永久链接一样,您仍然可以使用Animal.find(params[:id])

于 2013-06-22T02:09:30.903 回答