渲染到命名路径

时间:2014-08-19 16:47:56

标签: ruby-on-rails ruby-on-rails-4 cucumber

我有一个带有以下路线的rails项目:

get 'login', to: 'user_sessions#new', as: :login

UserSessionsController我有

def create
   @user_session = UserSession.new(params[:user_session])

   respond_to do |format|
     if @user_session.save
       # Do all the happy stuff
     else
       format.html { render :action => 'new' }
       format.xml { render xml: @user_session.errors, status: :unprocessable_entity }
     end
   end
 end

这样做没问题,但是当用户输入错误的参数时,路由是/user_sessions而不是/login,这是不整齐的(这意味着我的测试断言令人困惑)。

显然我可以redirect_to login_path,但我的@user_session.errors似乎不可用,所以页面上没有显示错误。

如何重定向回/login并仍显示错误?

编辑: Rails看起来好像很难,因为这是我不应该尝试做的事情。 RESTful路径并不是用户关心的,所以我不应该将它作为UI测试的一部分。相反,我正在查看用户 关心的呈现页面的实际内容。谢谢大家。

2 个答案:

答案 0 :(得分:3)

您可以添加

post 'login', to: 'user_sessions#create', as: :post_login

并相应地更改表单操作。

答案 1 :(得分:0)

这种情况正在发生,因为当您在表单中获得验证错误时,您正在创建操作而不是新操作 您的创建操作只是呈现错误的新操作模板,它不向服务器发送请求,因此您的网址保持不变所以要修复它,您只需更改创建的路径行动到此:

post 'login', to: 'user_sessions#create', as: :login

<强>更新

您只需更改创建操作的路线,然后在表单中进行更改,如下所示:

<%= from_for @resource, url: login_path do |f| %>
  // form fields
<% end %>

如果你要检查你的表单,你会发现它的方法是POST,所以当你提交它时,你的表单会发送一个POST请求,当你在您的浏览器地址栏中点击/登录它会发送GET请求所以在第一种情况下您将创建操作,在第二种情况下您将转到新操作