проблема представления рендеринга - PullRequest
0 голосов
/ 20 февраля 2011

Это два пользователя:

  1. Пользователь - зарегистрированный пользователь

  2. Гость - не авторизованный посетитель.

Пользователь и гость могут задать вопрос. Чтобы оставить вопрос, гость должен указать свой адрес электронной почты.

Это два представления "new.html.erb" и "new_for_guest.html.erb". Первый использует переменную @user. Второй нет.

Когда вопрос, созданный гостем, не проходит проверку, необходимо отобразить «new_for_guest.html.erb», сохраняя все введенные данные .

Код следующий:

def new
  @question = Question.new

  guest = session[user_id].nil?

  respond_to do |format|
    if guest
      format.html { render "new_for_guest" }
    else
      format.html { render "new" }
    end
  end
end

def create
  @question = Question.new(params[:question])

  guest = session[user_id].nil?

  respond_to do |format|
    if @question.save
      flash[:notice] = 'Question was successfully created.'
      format.html { redirect_to(@question) }
    else
      if guest
        format.html { render :action => "new_for_guest" } # problem
      else
        format.html { render :action => "new" }
    end
  end
end

Когда проверка гостя заканчивается неудачей и отображается представление "new_for_guest", я вижу в браузере URL "/ questions" вместо "/ questions / new". Из-за этого все таблицы стилей, используемые для «новых» действий, исчезли.

Когда для пользователя происходит сбой проверки и отображается "новый" вид, я вижу правильный URL "/ questions / new" и все в порядке.

Когда я просто говорю

format.html{ redirect_to new_question }

Будет выполнено «новое» действие, но все введенные пользователем данные исчезли.

Мне нужно отобразить представление "new_for_guest" в контексте "Вопросы / Новый".

Как это сделать?

Обновление

Я заметил то же поведение нетронутого кода, сгенерированного скаффолдом.

Когда при создании проверки не удается, новое действие отображается снова, но в URL вместо "/questions/new".

отображается" / questions "

Это странно. Это правильное поведение?

Я нашел похожий вопрос без ответа Действие Rails create перенаправляет на индекс, когда оно должно отображать новое действие

1 Ответ

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

Это правильное поведение. В соответствии с маршрутами RESTful, когда форма отправляется для объекта в виде POST, она отправляется на /object URI, что подразумевает создание нового объекта с неизвестным идентификатором. Это описано в Rails Guides . В результате, когда проверка завершается неудачно и вы просто визуализируете новое действие, вы используете этот URI, а не /object/new URI.

Кроме того, вам не нужно, чтобы ваши стили были конкретными для каждого действия, поскольку там наверняка будет ненужная избыточность кода (и я даже не уверен, как вы делаете это так, чтобы он не работал, когда URI изменения). То же самое касается наличия нескольких представлений для действия, это редко бывает абсолютно необходимо, и, похоже, это не в вашем случае, поскольку вы можете просто использовать пустой объект @user, когда он является гостем.

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