RoR: доступ к странице, созданной в обратном вызове after_save

У меня проблема с пониманием обратного вызова after_save rails. Вот фрагмент моей модели:

  after_save :log_creation

  private 

    def log_creation
      logger.info "RECEIVED => #{ self.name } - #{ self.value } - #{ self.id }"
      path_to_url = url_for({ :host => "localhost:8080", :action=>"show", :controller=>"testing", :format =>"pdf", :id => self })
      logger.info path_to_url
      file = open(path_to_url, "r").read
      logger.info file
    end

В журнале разработки я получаю ожидаемую информацию для первых двух logger.info. Третий я не понимаю, потому что получаю исключение 404 (ActiveRecord::RecordNotFound).

Итак, что я делаю неправильно?

Генерация PDF работает нормально (с использованием PDFkit), если я прокомментирую строку after_save и попытаюсь получить доступ к URL-адресу, все в порядке, но когда я попытаюсь получить к нему доступ через after_save, он не работает, как я ожидал.

Все это для отправки электронного письма (через почтовую программу) с прикрепленным к нему PDF-файлом. Он загрузил бы PDF (через контролируемый), а затем отправил бы его.


person anders    schedule 11.10.2011    source источник
comment
Я не совсем понимаю, что работает, а что нет, но разве вы не должны использовать :id =› self.id вместо :id =› self ?   -  person mb14    schedule 11.10.2011
comment
@ mb14 проблема связана со строкой 'file = open (path_to_url, r).read'. Строка url_for работает нормально - я вижу это в журнале, и это ожидаемо.   -  person anders    schedule 11.10.2011
comment
как выглядит ваш path_to_url в вашем журнале? может быть просто проблема относительного адреса. Я думаю, что File.open работает в контексте вашей локальной файловой системы, поэтому, если ваш путь начинается с /, вы на самом деле пытаетесь найти файл из корня файловой системы. Завершающая косая черта также может сбивать с толку.   -  person m_x    schedule 11.10.2011


Ответы (1)


Я думаю, что проблема связана с транзакциями. Новая модель сохранена, но транзакция еще не завершена. Попробуйте after_commit вместо after_save. Подробнее обо всех обратных вызовах см. в документации по обратным вызовам.

person rdvdijk    schedule 11.10.2011