Obtendo torna a reconhecer caminhos de roteamento personalizados
-
04-07-2019 - |
Pergunta
Então, eu tenho uma rota personalizada snazzy para login
# routes.rb
map.login '/login', :controller => 'sessions', :action => 'new'
Visite www.asite.com/login e você está lá. Como é costume com login falhou, no entanto, vamos fazer o seguinte na nossa acção. Nota que acontece no login falhou.
# sessions_controller.rb
def create
self.current_user = User.authenticate(params[:email], params[:password])
if logged_in?
# some work and redirect the user
else
flash.now[:warning] = "The email and/or password you entered is invalid."
render :action => 'new'
end
end
Isso é muito típico. Simplesmente tornar a nova ação e pronta para login novamente. Infelizmente você começa também com ele uma URL feio: www.asite.com/session. Ick! É possível obter tornando a respeitar a URL original?
Nenhuma solução correta
Outras dicas
O problema é este: o usuário primeiras visitas /login
e preenche o formulário. Quando enviar o formulário, eles POST para /sessions
, razão pela qual as mudanças de URL do navegador. Para contornar este problema, você pode fazer duas coisas:
Como Michael mencionado, você pode redirecionar de volta ao: nova ação, mudando a mais para:
else
flash[:warning] = "The email and/or password you entered is invalid."
redirect_to login_path
end
Note que você vai precisar para mudar o flash para que a mensagem está disponível no próximo pedido (seguindo o redirecionamento).
O segundo método é ligeiramente hackier, mas talvez vale a pena mencionar. Usando condições nas suas rotas, você pode mapear tanto o formulário de login (que é um GET) eo formulário de envio (que é um POST) para o mesmo caminho. Algo como:
map.login '/login',
:controller => 'sessions', :action => 'new',
:conditions => {:method => :get}
map.login_submit '/login',
:controller => 'sessions', :action => 'create',
:conditions => {:method => :post}
Então, se a sua ação de formulário é de login submeter caminho, as coisas devem funcionar como esperado.
Alterar render :action => 'new'
para redirect_to login_path