没有路线匹配[POST]" /"仅在测试中。

时间:2015-09-16 16:55:51

标签: ruby-on-rails rspec

使用Simple Form For,我创建了一个自定义身份验证系统。

routes.rb

get '/users/sign_in' => 'sessions#new', as: :sessions_new_user
post '/users/sign_in' => 'sessions#create', as: :sessions_create_user
match '/users/sign_out' => 'sessions#destroy', as: :sessions_destroy_user, via: :delete
get '/users/process_login' => 'sessions#process_login', as: :sessions_process_login

new.html.erb

<%= simple_form_for :user do |f| %>
<%= f.input :login, placeholder: "Login", label_html: { class: 'form-control' }%>
<%= f.input :password, label_html: { class: 'form-control' } %>
<%= f.submit "Log in", class: 'btn btn-lg btn-primary btn-block'  %>
<% end %>

这个问题是当我运行测试来模拟登录时,我收到此错误。

user visits root of application
     Failure/Error: click_on 'Log in'
     ActionController::RoutingError:
       No route matches [POST] "/"

user_spec.rb

scenario 'user visits root of application' do
        visit root_path

        expect(page).to have_content("Sign in to continue")

        fill_in ' Login', with: ENV['NTUSERNAME']
        fill_in ' Password', with: ENV['NTPASSWORD']
        click_on 'Log in'

    end

这在开发中很好用。我弄清楚了。

3 个答案:

答案 0 :(得分:1)

首先,如果您正在学习Rails,我建议您从简单form helpers开始,因为您可以更清楚地定义您正在寻找的内容。由于您没有使用RESTful路由,因此您必须手动定义所有内容,并且确实错过了Rails的约定优于配置的方法。

但是,如果你真的想让Simple Form工作,那么你可以这样做:

<%= simple_form_for :user,  url: sessions_create_user, method: :post do |f| %>
  <%= f.input :login, placeholder: "Login", label_html: { class: 'form-control' }%>
  <%= f.input :password, label_html: { class: 'form-control' } %>
  <%= f.submit "Log in", class: 'btn btn-lg btn-primary btn-block'  %>
<% end %>

另请注意,由于您没有使用ActiveRecord支持的对象(只是标签),因此您必须小心将预期的params与Simple Form发送的内容相匹配.I& #39; m也很好奇你如何让SF在开发中为用户会话呈现正确的操作路径而不指定它...

答案 1 :(得分:1)

因为simple_form_for没有url,它会使用当前网址提交数据

未经测试但我认为如下:

在开发过程中,当您访问root时,它会重定向到/users/sign_in,发布到/users/sign_in是可以接受的

在rspec中,重定向不会更改当前网址,它仍为root_path,因此发布到/无效

答案 2 :(得分:0)

不允许嵌套表单...

我不小心嵌套了一个带有“#”动作的表单标签。这一切都在开发中起作用,因为浏览器发现它是一个嵌套表单,它忽略了标签。但是,当我运行机架测试时,它以 No route matches [POST] “/” 失败 - 当我使用 JS/selenium 测试时它也确实有效,因为它在真实浏览器中运行。

<%= simple_form_for @user do |f| %>
  <form action="#" method="POST">    
    <%= f.input :login %>
    <%= f.input :password %>
    <%= f.submit "Log in" %>    
  </form>
<% end %>