使用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
这在开发中很好用。我弄清楚了。
答案 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 %>