2013-06-22 5 views
0

Как создать постоянную ссылку с идентификатором для новой модели?Как создать постоянную ссылку с идентификатором?

например

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

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

Как добавить правильный обратный вызов, так что идентификатор вставляется? before_save или after_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 вашей животной модели вместо добавления Постоянная ссылка на ваш db. 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 

Это сделает все ваши URL-адресов автоматически, как постоянную ссылку, которую вы пытаетесь создать, и вы все еще можете использовать Animal.find(params[:id])

1

Возможно, вам не нужно поддерживать постоянную ссылку на базу данных.

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

Такой подход позволил бы добавить постоянную ссылку на модель с помощью конкатенации идентификатора и имя каждого раза, когда постоянная ссылка прочитана.