如何创建一个带有新模型ID的永久链接?
E.g
animal = Animal.create(name: 'cool dog') #creates animal with id of 1 and name of dog
animal.permalink => "1-cool-dog"
如何添加正确的回调以插入ID? before_save
或after_save
不起作用
after_save :update_permalink #or before_save
def update_permalink
self.permalink = "#{id} #{name}".parameterize
end
最终发生的事情是我得到“酷狗”而不是“1-cool-dog”
我明白了。它设置一个属性而不将其保存在after_save上。但是不能在before_save上工作,因为还没有在新记录上创建id。
答案 0 :(得分:1)
也许您根本不需要将固定链接保存到数据库中。
def permalink
"#{self.id} #{self.name}"
end
这种方法会在每次读取永久链接时通过连接id和名称来为模型添加固定链接。
答案 1 :(得分:1)
根据http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
您应该使用after_commit而不是after_save
save和destroy都包含在确保这一事务的事务中 无论你在验证或回调中做什么都会在它下面发生 保护封面。因此,您可以使用验证来检查值 交易取决于或你可以提出例外 回滚回调,包括after_ *回调。
因此,在您之外看不到对数据库的更改 连接直到操作完成。例如,如果您尝试 在after_save中更新搜索引擎的索引,索引器不会 看到更新的记录。 after_commit回调是唯一的回调 一旦提交更新就会触发。见下文。
正如我在上面评论的那样,您可能只想简单地覆盖动物模型的to_param方法。
def to_param
"#{id}-#{name.parameterize}"
end
这会使您的所有网址自动像您尝试创建的永久链接一样,您仍然可以使用Animal.find(params[:id])