Как пересылать / маршрутизировать запросы в зависимости от условий в Rails 3? - PullRequest
0 голосов
/ 09 июня 2011

это мой первый вопрос здесь, и в настоящее время я пытаюсь создать свое первое приложение Ruby on Rails, поэтому этот вопрос может быть базовым.

Проблема:

Мне нужна форма на корневом сайте, которая состоит только из двух полей: адрес электронной почты и пароль для модели пользователя. В зависимости от того, существует ли уже введенный адрес электронной почты, форма должна переслать запрос «users # create» (т. Е. Создать нового пользователя) или «session # create» (т. Е. Зарегистрировать пользователя в .. если пароль правильный)

Что я пробовал:

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

В основном это выглядит так:

def decide
  if User.find_by_email(params[:email])
    # Copied in all of the code from sessions#create
    # with a redirect at the end so a /decide page doesn't get rendered
  else
    # Copied in all of the code from users#create
    # with a redirect at the end so a /decide page doesn't get rendered
  end
end

-

Теперь это работает, и я очень горжусь собой, что понял это как новичка, но я слышу, как опытные программисты в агонии кричат ​​об этом коде. Я уверен, что это не «Путь Рельсов».

Я повторяю большое количество кода и чувствую, что помещаю в контроллер что-то, что не было сделано для этой цели.

Другая проблема заключается в том, что я не могу заставить работать мой интеграционный тест rspec, который в основном идет к root_path, заполняет форму новым пользователем, нажимает кнопку и ожидает успешного завершения ... но тест получает вернул пустой HTML-документ при нажатии кнопки. Хотя он прекрасно работает, когда я делаю то же самое в браузере.

Итак, я понял:

Не могли бы вы как-то поместить вышеприведенный оператор if в файле rout.rb и перенаправить запрос на соответствующий контроллер и действие?

Если так, то как?

Или у кого-то есть другая идея, как этого добиться?

Спасибо,

-Konstantin

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Отвечая на мой вопрос:

Оказывается, проблема со спецификацией была просто из-за того, что webrat не следовал за редиректами в rails 3. На самом деле это общая проблема, которая решается -> здесь , например.

Так что, по крайней мере, эта проблема исчезла.

1 голос
/ 09 июня 2011

На самом деле, это довольно надежный способ решения проблемы.

Маршруты в Rails должны быть простым способом сопоставления URL-адресов с кодом.Такая логика принадлежит именно тому, где вы ее разместили: в контроллере.

...