перенаправление на псевдоним маршрута при ошибке проверки формы - PullRequest
5 голосов
/ 07 мая 2010

Если я нахожусь на псевдониме маршрута, таком как / register, и у меня появляется ошибка формы, и я отображаю: new, возможно ли, чтобы путь был / register еще?

В данный момент эторендеринг / новый

Я мог бы сделать redirect_to register_path, но тогда я бы потерял параметры?

Это делает следующий тест неудачным:

  Scenario: Try registering with a bad staff number
Given I am on the registration page
When I fill in "email" with "kevin@acme.com"
And I fill in "First Name" with "Kevin"
And I fill in "last name" with "Monk"
And I fill in "Employee Number" with "something barking123"
And I press "Register"
Then I should be on the registration page
And I should see "Your employee ID number looks incorrect."

Ответы [ 5 ]

1 голос
/ 24 августа 2010

Альтернативой может быть установка двух «регистрационных» маршрутов. Один, который принимает только запросы GET (и переходит к действию: new), а другой - только запросы POST (и переходит к действию создания, но отображает тот же шаблон, что и для нового).

Это может выглядеть так:

map.get_register 'register', :controller => :registrations, 
                 :action => :new, :conditions => { :method => :get }
map.post_register 'register', :controller => :registrations, 
                 :action => :create, :conditions => { :method => :post }

Тогда в вашем контроллере:

def new
   @registration = Registration.new
   # renders the 'registrations/new' template
end
def create
   @registration = Registration.new(params[:registration])

   # render the 'registrations/new' template if we fail validation
   return render(:action => :new) unless @registration.save
   # otherwise renders the "create" template which is likely a thank-you
end

В этом вопросе, похоже, есть нечто большее: Использовать пользовательский маршрут при сбое проверки модели

1 голос
/ 14 июля 2010

Вызов render из действия будет означать, что URL останется неизменным, независимо от того, что было GET или POST'd.Причина, по которой URL является / new, заключается в том, что 'Register' должен быть POST'ing для / new.Если вы хотите, чтобы эта функция прошла, вы должны изменить «Тогда я должен быть на странице регистрации» на «Тогда я должен быть на новой странице регистрации» и написать соответствующий веб-шаг, на мой взгляд.

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

Путь Rails состоит в том, чтобы снова отобразить «новое» (т.е. зарегистрировать) действие, поскольку вы создали объект, форма будет содержать ранее введенные значения, а также сообщения об ошибках.Если вы перенаправляете, вы должны сохранить объект в сеансе или базе данных, прежде чем выполнять перенаправление.При отклонении от соглашения всегда хорошо быть уверенным, что вы делаете это по уважительной причине.

0 голосов
/ 19 июля 2010

Действительно, это похоже на исправление одной строки в тесте. (Почему вы предпочитаете быть на странице / регистрация?).

Если это действительно важно, вы также можете временно хранить параметры в сеансе var.

0 голосов
/ 15 июля 2010

Если вы действительно этого хотите, то можете объединить действие «создать» с действием «новое», а действие «обновить» - с действием «изменить». Затем вам нужно будет проверить тип запроса и обработать его соответствующим образом.

Это дало бы то, что вы просите. Кроме того, люди смогут использовать URL-адрес «ошибка» и все равно перейти на действительную страницу. То есть даже после получения ошибки они могут скопировать / вставить URL-адрес, и для него будет действительная страница GET.

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

Редактировать: пример ..

def new
  if request.get?
    @user = User.new

  elsif request.post?
    @user = User.new(params[:user])
    if @user.save
      redirect_to users_path
    else
      render :new
    end
  end
end

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

...