Rails 3 иногда случаются ошибки маршрутизации - PullRequest
1 голос
/ 19 марта 2012

Я использую Rails 3.1.1 и получаю странную ошибку. В процессе разработки (еще не пробовал запускать его в производство) я иногда получаю ошибки маршрутизации в моем контроллере или в шаблоне почтовой программы, когда он пытается сгенерировать URL для вновь созданной записи. Это происходит, даже если запись создана успешно и, похоже, не имеет ничего общего со свойствами записи (я могу сразу после этого воссоздать запись с точно такими же параметрами и не получить ошибку, она кажется совершенно случайной, когда это происходит).

Кажется, это случается, может быть, один раз в 10 раз, хотя я не могу сказать, что когда-либо видел, как это происходило до того, как я добавил действие почтовой программы.

Есть еще один потенциально усложняющий фактор: я использую метод шифрования, чтобы скрыть идентификатор записи в ее URL, но в остальном это работает без проблем. Для этого я адаптировал рассмотренный метод здесь

Мне кажется, что URL не генерируется вовремя, чтобы link_to вызывал время от времени ... Но это не имеет особого смысла для меня. Я не думал, что мне нужно волноваться об условиях гонки.

Вот мои журналы ошибок, когда это происходит в контроллере (когда параметры не требуют генерации электронной почты):

ActionController::RoutingError (No route matches {:action=>"show", :controller=>"watch_lists", :id=>#<WatchList id: 195, title: "sfdsfd", created_at: "2012-03-19 05:18:46", updated_at: "2012-03-19 05:18:46", public_list: false>}):
  app/controllers/watch_lists_controller.rb:72:in `block (2 levels) in create'
  app/controllers/watch_lists_controller.rb:56:in `create'

И вот когда это происходит в шаблоне почтовой программы (когда параметры действительно требуют создания электронного письма перед командой рендера):

Rendered watch_list_mailer/share_notification.html.erb (3.2ms)
Completed 500 Internal Server Error in 113ms

ActionView::Template::Error (No route matches {:action=>"show", :controller=>"watch_lists", :id=>#<WatchList id: 210, title: "sdggsgsg", created_at: "2012-03-19 05:47:17", updated_at: "2012-03-19 05:47:17", public_list: true>}):
    20:             <% end %>
    21:         <% end %><br>
    22:         <br>
    23:         Here's a link to your WatchList: <%= link_to @wl.title, watch_list_url(@wl) %><br>
    24:         <br>
    25:         Enjoy!
    26:     </p>
  app/views/watch_list_mailer/share_notification.html.erb:23:in `_app_views_watch_list_mailer_share_notification_html_erb___1391186431365383285_70156615518000'
  app/mailers/watch_list_mailer.rb:12:in `share_notification'
  app/controllers/watch_lists_controller.rb:124:in `share_notification'
  app/controllers/watch_lists_controller.rb:68:in `block (2 levels) in create'
  app/controllers/watch_lists_controller.rb:63:in `each'
  app/controllers/watch_lists_controller.rb:63:in `block in create'
  app/controllers/watch_lists_controller.rb:56:in `create'

РЕДАКТИРОВАТЬ: После дальнейшего тестирования это происходит независимо от того, включаю ли я почтовое задание. Скорее всего, подстегнутая запутывание ссылок. Вполне возможно, что кодирование ссылок как-то связано с этим (я должен был убедиться, что URI-экранирует их, чтобы предотвратить косые черты в неправильных местах в другом месте моего кода). Я исследую это далее и сообщу.

1 Ответ

0 голосов
/ 19 марта 2012

Это была проблема с шифрованием идентификатора, которое иногда создавало недействительные ссылки, и я не смог учесть это достаточно рано в процессе.

В lib / obfuscate.rb

def uri_encrypt(value)
    URI.escape(self.encrypt(value), Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
end

В моей модели

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