render (и redirect_to) должны как-то прекратить обработку действия? - PullRequest
1 голос
/ 11 мая 2010
def update 
 @user = User.find(params[:id]) 
 if @user.update_attributes(params[:user])
      render :action => show
  end
      render :template => "fix_user_errors"
end

Предыдущий код сгенерирует ошибку (потому что render вызывается дважды) в случае успешного выполнения update_attributes Акт вызова метода render (и redirect_to) должен как-то прекратить обработку действия? Но не почему?

Ответы [ 3 ]

2 голосов
/ 11 мая 2010

render фактически не прекращает обработку действия.

Вам необходимо добавить else в ваше заявление if:

if @user.update_attributes(params[:user])
  render :action => show
else
  render :template => "fix_user_errors"
end

Я думаю, что вы также можете использовать «return render ...», который немедленно вернется из метода действия, но это может иметь непредвиденные последствия.

1 голос
/ 11 мая 2010

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

Возможно, вы захотите вызвать return после вызова render, если вы на самом деле сделали это.

Кроме того, вызов redirect (я предполагаю, что я не уверен) фактически отправляет заголовок Location в ваш браузер, но не завершает ваши действия. Вы должны вернуться или перейти после звонка, чтобы не вызывать его дважды.

0 голосов
/ 11 мая 2010

Вы можете использовать else, на самом деле не имеет смысла рендерить действие и рендерить другое. Я бы написал так:

def update 
  @user = User.find(params[:id]) 
  if @user.update_attributes(params[:user])
    redirect_to :action => show
  else
    render :template => "fix_user_errors" #probably you want to render the edit template here.
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...