Проблема маршрута Rails 3

После решения другой проблемы с маршрутами у меня появилась еще одна.

У меня есть этот маршрут в моих маршрутах.rb:


match "user/create_new_password/:reset_password_key" =>"users#create_new_password", :via=>[:post, :get], :as=>:create_new_password

Я могу проверить это в своих функциональных тестах следующим образом:


test "should create new password " do
    post :create_new_password, {:user=>{:password=>"123456", :password_confirmation=>"123456"}, :reset_password_key=>user.reset_password_key}
end

На мой взгляд, у меня есть следующая форма:


=simple_form_for @user, :url=>create_new_password_path do |f|
    =f.input :password, :label=>I18n.t("activerecord.attributes.user.email")
    =f.input :password_confirmation, :label=>I18n.t("activerecord.attributes.user.password_confirmation")
    =f.submit I18n.t "activerecord.actions.user.create_new_password"


Когда я отправляю форму, я получаю:


No route matches "/user/create_new_password/OqQxYTgjYKxXgvbAsTsWtMnIpMOpsjCRzLGZmJZLSbYtjvcvdpO"

Большая строка — это ключ reset_password_key.

Я протестировал его в функциональных тестах с тем же значением для reset_password_key.

Соответствующий вывод для rake-маршрутов:


create_new_password POST|GET /user/create_new_password/:reset_password_key(.:format) {:controller=>"users", :action=>"create_new_password"}

Я что-то упускаю...


person Joao Pereira    schedule 09.02.2011    source источник
comment
Должен спросить: вы запускали сервер после редактирования маршрутов? Если да, можете ли вы опубликовать содержимое вашего config/routes.rb файла? Спасибо и удачи!   -  person Michelle Tilley    schedule 10.02.2011
comment
Да много раз. Однако я нашел проблему. Я учусь этому трудным путем. Я недооценил хитрость Rails... Поскольку я редактирую существующую сущность, в данном случае @user, rails устанавливает _method на :put.... так что я ничего не вставил в свой маршрут...   -  person Joao Pereira    schedule 10.02.2011


Ответы (1)


В ответ на комментарий BinaryMuse я обнаружил, что пошло не так... Я проверил запрос в firebug и обнаружил, что _method=put отправляется с POST. Сообразительность Rails обнаружила, что я редактирую существующий экземпляр пользователя (@user), поэтому по умолчанию он устанавливает POTS на PUT, используя параметр _method.

Проблема в том, что в моих маршрутах у меня нет метода PUT в массиве :via. Только что поменял на:


 match "user/create_new_password/:reset_password_key" =>"users#create_new_password",:via=>[:get, :put], :as=>:create_new_password

И в контроллере:


def create_new_password
   if request.put?
      #change password
   else
     #render template
   end

end

person Joao Pereira    schedule 10.02.2011