2013-06-22 67 views
0

如何創建一個帶有新模型ID的永久鏈接?如何使用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 - 酷狗」

我明白爲什麼。它設置一個屬性而不保存在after_save上。但是在before_save上不起作用,因爲id尚未在新記錄上創建。

+0

有些事情,你應該想想是壓倒你的動物模型的to_param方法,而不是添加永久鏈接到你的分貝。 Rails將自動奇蹟般地打開以id開頭的永久鏈接。 –

回答

1

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

您應該使用after_commit代替after_save的

都保存和銷燬進來包裹在確保 無論你在驗證或回調做會根據其 保護髮生交易蓋。因此,您可以使用驗證來檢查交易所依賴的值,或者您可以在 回調中引發回滾以回滾(包括after_ *回調)。

因此,直到操作完成後,纔會在 連接之外看到對數據庫的更改。例如,如果您嘗試更新after_save中的搜索引擎的索引, 索引器將不會 查看更新的記錄。 after_commit回調是在更新提交後觸發的唯一一個 。見下文。

正如我上面的評論你可能想簡單地覆蓋你的動物模型是這樣的to_param方法。

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

這將使所有的網址自動像你試圖創建永久鏈接,你仍然可以使用Animal.find(params[:id])

1

也許你不需要將永久鏈接保存到數據庫中。

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

這種方法通過在每次讀取固定鏈接時連接id和name來爲模型添加固定鏈接。