2010-12-04 62 views
1

我正在使用AuthLogic在我的Rails应用程序中对用户进行身份验证。该部分正确设置并正确工作。如何在Rails中重新呈现操作时在页面URL中维护相同的控制器和操作?

我有以下途径定义:

map.login '/account/login', :controller => :user_sessions, :action => :new 

调用耙路线返回我的期望:

login /account/login {:controller=>"user_sessions", :action=>"new"} 

当有人提出一个登录,它调用UserSessionsController.create:

def create 
    @user_session = UserSession.new(params[:user_session]) 
    if @user_session.save 
     flash[:notice] = "Login successful!" 
     redirect_back_or_default account_url 
    else 
     render :action => :new 
    end 
end 

如果@ user_session.save失败,则适当的错误消息出现在sc颖。但是,浏览器URL也会更改为“http:// localhost:3000/user_session”,而不是停留在“http:// localhost:3000/account/login”上。

我认为问题是我正在给渲染方法。我应该喂什么?

回答

0

进一步挖掘后,我发现在另外的StackOverflow问题的解决方案:Use custom route upon model validation failure

我只是修改了我的路线,以增加对冒充为“/帐号/登录”一个新问题:

map.login '/account/login', :controller => :user_sessions, :action => :new, :conditions => {:method => :get} 
map.login_post '/account/login', :controller => :user_sessions, :action => :create, :conditions => {:method => :post} 

然后,我更新了我的观点,以利用新途径:

<% form_for @user_session, :url => login_post_path do |f| %>

这完美的作品。失败的登录会提供相应的错误消息并维护“/ account/login”网址。

2

这实际上是此过程的预期行为。在标准的脚手架式RESTful控制器中,createupdate操作中的验证错误将简单渲染原始模板而不重定向。这会导致您所看到的 - new模板将与URL中的create操作的URL一起显示。原因是为了向用户显示发生了什么错误的信息,该视图必须能够访问无效模型对象,在您的案例中为@user_session

如果要强制重定向到原始URL,则可以使用redirect_to而不是render,但这会导致您丢失有关错误的信息。您需要在会话中手动保存错误,这会很麻烦。我的建议是不要担心URL与原始URL不匹配,因为这在所有Rails应用程序中都是非常标准的。

+0

我很欣赏这个建议,但是我发现强迫性的不一致令人不安。任何在页面上出现错误并想要报告的人都将最终链接到单击链接无效的页面。正如你所说,使用redirect_to并坚持错误也是一样。 – Shaun 2010-12-05 16:01:12

+0

没有其他选择。数据必须以某种方式持续存在。要么你不做重定向,要么将它存储在某处并重定向。 – 2010-12-07 20:06:53

1
(基于肖恩的回答在这里)

为Rails 4只是增加解决方案:

增加新路线路线文件:

后 '/车/新'=> '车#创建',如: :create_post

添加网址:create_post_path形成标签

完成。

相关问题