after_create не обновляет атрибут Post - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь создать обратный вызов для модели Post. Обратный вызов должен обновить атрибут сообщения slug. Это соответствующий код в post.rb:

class Post < ApplicationRecord
  after_create :set_slug

  SLUG_FILTER = '/\!?@#$`\'%^&*+=",.()[]{}‘’'

  private

   def set_slug
     self.slug = title.delete(SLUG_FILTER).strip.gsub(/\s+/,'-').downcase
   end
end

Когда я создаю Post в консоли rails, я получаю следующий результат:

irb> author(1).posts.create!(title: 'some post title', markdown: 'test **123**')
=> #<Post id: 25, title: "some post title", markdown: "test **123**", ..., slug: "some-post-title">
irb> Post.find(25)
=> #<Post id: 25, title: "some post title", markdown: "test **123**", ..., slug: nil>

Кажется, что slug Атрибут создается, но затем становится nil. Почему атрибут slug равен nil, а не some-post-title? Буду признателен за любую помощь.

Ответы [ 2 ]

4 голосов
/ 19 июня 2020

self.slug = - это просто присвоение переменной slug, поэтому не сохраняется в базе данных. Таким образом, вам должен понравиться приведенный ниже код.

before_create :set_slug

Этот код присваивается slug перед записью в базу данных.

4 голосов
/ 19 июня 2020

обратный вызов after_create запускается после сохранения объекта. Если вы измените атрибут, он больше не будет сохранен. Before_create должен работать :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...