Rails 3.1 Ни один маршрут не соответствует контроллеру и действию, но они существуют

#ruby-on-rails-3 #routes

#ruby-on-rails-3 #маршруты

Вопрос:

Я играю с тестовым приложением rails. Однако я наткнулся на проблему, которую не могу решить. У меня есть пользовательский контроллер, и в нем есть метод activate.

В файле routes.rb у меня есть

 match 'activate/:email/:validation_code' => 'users#activate', :as => :activate_user, :via => :get
  

После этого я пытаюсь использовать activate_user_path(@user) , но возникает ошибка маршрутизации.

No route matches {:controller=>"users", :action=>"activate", :email=>#<User id: 12, email: "someone@test.test", validation_code: "zbBPLQUsBgPvEJfcjxmXuxFxuJAKEoqQNASkbybihpnmzSbhxdC...", active: false, created_at: "2011-11-10 14:56:23", updated_at: "2011-11-10 14:56:23">}

Запуск rake routes показывает, что маршрут существует:

activate_user GET /activate/:email/:validation_code(.:format) {:controller=>"users", :action=>"activate"}

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

Любая помощь приветствуется 🙂

Комментарии:

1. Можете ли вы опубликовать полное сообщение об ошибке вместо того, чтобы заканчивать ... там, где это становится важным?

2. Извините за это, не думал, что это важно. Оставшаяся часть содержала другие поля пользовательского объекта. Теперь я отредактирую сообщение, чтобы включить их.

Ответ №1:

Я бы убедился, что вы на самом деле вызываете GET, а не POST в качестве метода.

Если вы отправляете форму, по умолчанию используется значение POST, что будет означать, что у вас нет соответствующего маршрута, маршрут, который вы указали выше, работает только для запросов GET.

Комментарии:

1. На самом деле это происходит при использовании activate_user_path(@user) для создания ссылки в представлении, поэтому там нет вызова запросов. Если я вручную введу URL в поле адреса браузера, произойдет то же самое — маршрут не совпадает.

Ответ №2:

Работает ли у вас activate_user_path (:email => @user.email, :validataion_code => @user.validation_code)?

Редактировать

Я не знаю почему, но когда я изменил: validation_code на code, это работает.

 match 'activate/:email/:code' => 'users#activate', :as => :activate_user, :via => :get
  

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

Комментарии:

1. Я тоже пробовал это перед публикацией в SO. Результат тот же. Единственное отличие, конечно, заключается в дампе ошибки, где перечисляется не весь объект, а только эти два переданных свойства.

2. Ладно, это странно, потому что я пробовал это в своих маршрутах и тестировал в консоли rails, и у меня это работает. Поэтому, пожалуйста, дважды проверьте это. Вы можете использовать app.activate_user_path(:email => «foo», :code =>»bar») в консоли rails

3. Я чувствую, что делаю что-то совершенно неправильное. В консоли rails ошибка не возвращается. Показан правильный путь — => "/activate/foo/bar" . Однако, когда я запускаю rails s, ошибка все еще присутствует. Имеет ли значение, что я использую метод _path или _url в шаблоне ActionMailer?

4. Нет, это не должно. Вы перезапускали сервер перед его тестированием? Я думаю, вы также можете попробовать другой подход для выполнения активации пользователя. Используйте только validatoincode в пути, а затем в действии user#activate: user = User.find_by_validation_code… Я думаю, вам не нужна электронная почта.

5. Да, я знал, что это было что-то глупое с моей стороны. Вы не можете поместить электронное письмо в URI. 🙂 В настоящее время со всеми изменениями это работает, если первый параметр не содержит символа @ .