如何用id创建永久链接?

时间:2013-06-22 01:32:12

标签: ruby-on-rails

如何创建一个带有新模型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_saveafter_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。

2 个答案:

答案 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])