A maneira correta de lidar com envios de formulários inválidos no Rails
Eu sou novo no Rails e não tenho certeza se concordo com a maneira como fiz as coisas em alguns dos tutoriais pelos quais passei. O problema tem a ver com como lidar com envios de formulários inválidos. A maneira padrão de fazer as coisas parece ser:
class ThingsController < ApplicationController
# POST /things
def create
@thing = Thing.new(params[:thing])
if @thing.save
flash[:notice] = 'Thing created'
redirect_to(@thing)
else
render :action => :new
end
end
Quando @ thing.save falha, o usuário é apresentado com o mesmo formulário, preenchido previamente com os valores que ele acabou de inserir, juntamente com um flash do que deu errado. Até aí tudo bem, exceto que agora a URL mudou de / things / new para things /, que seria de esperar renderizar a exibição do índice.
Além disso, se o usuário atualizar a página, ele estará olhando para a exibição de índice. Se ele clicar novamente, ele será solicitado a reenviar o formulário, que eu sempre tentei evitar. Se eu redirecionar para (new_thing_path), o envio anterior do usuário será perdido, assim como as mensagens de erro.
Percebo que RESTfully, esse método pode estar "correto", pois a criação de um objeto de coisa deve ser o resultado de POSTing para / things, mas, na interface do usuário, não me importo particularmente com isso.
Eu poderia "manualmente" salvar o objeto @thing inválido na sessão do usuário, para ser exibido depois que eu o redirecionar de volta para new_thing_path, mas isso parece um hack. Parece que deveria haver uma "maneira trilhos" de fazer exatamente isso.
Idéias?