У меня есть базовая настройка блога в одном из моих приложений. Каждый blog
имеет логическое значение, указывающее, является ли он published
, а затем дату, когда это будет published_on
. published_on
- это nil
, пока он не обновится с published
как true
. Логика контроллера такая:
def create
@blog = Blog.new(blog_params)
@blog.user_id = current_user.id
if @blog.published
@blog.published_on = Time.now
end
respond_to do |format|
if @blog.save
format.html { redirect_to @blog, notice: 'Blog was successfully created.' }
format.json { render :show, status: :created, location: @blog }
else
format.html { render :new }
format.json { render json: @blog.errors, status: :unprocessable_entity }
end
end
end
А для обновления ...
def update
if @blog.published && @blog.published_on.nil?
@blog.published_on = Time.now
end
...
end
Однако функция обновления не обновляется, и я получаю сообщение об ошибке undefined method 'strftime' for nil:NilClass
, где она должна отображаться на странице show
. Когда я его rails c
, published_on
не сохранил.
Что я должен поставить вместо логики Time.now
, которая у меня сейчас есть в контроллере. Он отлично работает с blog#create
, но что-то не так с blog#update
.
Думаю, контроллер может оказаться не там. Вы можете реализовать обратный вызов after_save в своей модели. Там вы можете установить метку времени self.published_on = DateTime.now if self.published
@SimonFranzen Да! Я всегда забываю о модели! Это сработало отлично. Если вы хотите написать это как ответ, я с радостью выберу его.
Пожалуйста, посмотрите мой ответ. Вы также должны посмотреть, изменился ли опубликованный bool. В противном случае он будет устанавливать дату каждый раз, когда вы сохраняете модель.
Вы пробовали DateTime.now вместо Time.now? Это разные классы, и я не уверен, что атрибут datetime можно напрямую назначить объекту Time.
@blog.published_on = DateTime.now
Думаю, контроллер может оказаться не там. Вы можете реализовать обратный вызов after_save в своей модели. Там вы можете установить метку времени self.published_on = DateTime.now if self.published
after_save :set_published_at
def set_published_at
self.published_on = DateTime.now if self.published
end
Боковое примечание: я бы предложил назвать его
published_at
, поскольку он соответствует соглашению Rails о created_at и updated_at.