Rails валидация условного перенаправления - PullRequest
1 голос
/ 08 февраля 2011

У меня сейчас проблема с тем, как работает Rails и отвечает на результат проверки.У меня есть форма регистрации пользователя.Пользователь может нажать эту форму в двух разных местах.Они могут попасть в форму с домашней страницы или из users/new.Обе формы будут публиковаться в том же месте, где я пытаюсь сохранить их СУХОЙ.

Страница users/new работает так, как ожидается.Если у пользователя возникла проблема с проверкой, он вернется и заполнит форму.Где я могу найти проблему на главной странице.Если у пользователя возникла проблема с проверкой, он теперь перенаправляется на страницу users/new.Я бы предпочел, чтобы на главной странице я возвращал пользователя на ту же страницу и показывал там результаты проверки.Есть ли способ в контроллере для перенаправления в форму, в которой был пользователь?

def create
  @user = User.new(params[:user])

  respond_to do |format|
    if @user.save
      format.html { redirect_to(@user, :notice => 'User was successfully created.') }
      format.xml  { render :xml => @user, :status => :created, :location => @user }
    else
      format.html { render :action => "new" } # I'm thinking I can do something here?
      format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
    end
  end
end

Я пытался изменить строку render :action => 'new' для перенаправления на URL пользователя, но это не сработало.Я что-то упускаю?

Ответы [ 3 ]

2 голосов
/ 08 февраля 2011

Во-первых, я бы добавил параметры строки запроса к URL-адресу, который он публикует с контроллером, и действие, из которого он получился, примерно так:

# Using form_tag
<%= form_tag user_path(@user, :controller_name => controller.controller_name, :action_name => controller.action_name) do %>

# Using form_for
<%= form_for @user, :url => user_path(@user, :controller_name => controller.controller_name, :action_name => controller.action_name) do %>

Затем вы можете обновить эту строку в create действие вашего контроллера, подобное этому:

render '#{params[:controller_name]}/#{params[:action_name]}'

Обновление

Я только что понял, что с помощью приведенного выше кода, будет отображаться правильное представление при первом сбое проверки, но если проверка завершится неудачно во второй раз, она попытается отобразить представление users/create.Если вы хотите выбрать этот маршрут, вы не должны использовать controller.controller_name и т. Д. В представлении, а правильно назначить @controller_name и использовать эту переменную вместо этого.Однако это только добавляет к «излишнему» комментарию, сделанному Ксавье.

2 голосов
/ 08 февраля 2011

Искусство на правильном пути, но вы не можете использовать перенаправление, так как вам нужна переменная экземпляра @user, установленная в вашем контроллере, которая будет потеряна при новом HTTP-запросе (потому что когда-либо запрос обрабатывается новый, чистый экземпляр контроллера).

Но вы можете сами использовать информацию о реферере и использовать ее для выбора нужной страницы для рендеринга:

render :action => (request.referer =~ /\/users\/new/)? :new : :index

Примечание. В то время, когда я размещал сообщение, появился другой ответ, в котором предлагается добавить старые поля контроллера / действия в вашу форму, но мне это кажется излишним - у вас уже есть вся необходимая информация в request.referer.

Надеюсь, это поможет!

0 голосов
/ 08 февраля 2011

Попробуйте redirect_to :back
Это сокращение для redirect_to(request.env["HTTP_REFERER"])

Упс, это работает только на успех. извините

хорошо, тогда вы должны проверить внутри блока (после format.html), откуда он пришел (посмотрев на request.env ["HTTP_REFERER"]), и отрендерить соответствующее действие.

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