添加于编辑,2013年2月11日:button_to只是间歇工作,并经常导致“无路线”错误
我应该更清楚地表明,我遇到的问题是不是我无法获得我编写的ERB代码以生成正确的HTML代码。相反,我的Rails安装有时会正确解释HTML代码,因此单击该链接会产生正确的效果,有时也会产生错误的“无路由”错误。更多细节在我的答案下面。
原来的问题,2013年2月8日:
我正在使用Rails 3.2.11一个简单的登录表单。我已经尝试了几种编码表单提交按钮的方法,但由于缺少路由错误,每个方法都失败了。我有一种方法工作,并检查了我的代码。但是,现在这个代码很失败。
这是app/views/session/new.html.erb
代码(我用simple_form
,而不是它的按钮包装):
<h2>Log in</h2>
<%= simple_form_for :session do |f| %>
<%= f.input :username %>
<%= f.input :password %>
<%= button_to "Submit", session_index_path %>
<% end %>
的HTML代码,这会产生的相关部分是:
<h2>Log in</h2>
<form accept-charset="UTF-8" action="/session/new" class="simple_form session" method="post" novalidate="novalidate">
<div style="margin:0;padding:0;display:inline">...</div>
...the input fields...
<form action="/session" class="button_to" method="post">
<div>
<input type="submit" value="Submit" />
<input name="authenticity_token" type="hidden" value="...token value here..." />
</div>
</form>
</form>
这是我的config/routes.rb
:
MyApp::Application.routes.draw do
resources :at_user
resources :session, :only => [:new, :create, :destroy]
match 'login' => 'session#new', as: :login
match 'logout' => 'session#destroy', as: :logout
root to: 'main#index'
end
这是w帽子命令rake routes
输出:
at_user_index GET /at_user(.:format) at_user#index
POST /at_user(.:format) at_user#create
new_at_user GET /at_user/new(.:format) at_user#new
edit_at_user GET /at_user/:id/edit(.:format) at_user#edit
at_user GET /at_user/:id(.:format) at_user#show
PUT /at_user/:id(.:format) at_user#update
DELETE /at_user/:id(.:format) at_user#destroy
session_index POST /session(.:format) session#create
new_session GET /session/new(.:format) session#new
session DELETE /session/:id(.:format) session#destroy
login /login(.:format) session#new
logout /logout(.:format) session#destroy
root / main#index
的button_to
目标路径是session_index_path
,这应该引起的0的create
方法被调用 - 和一段时间,它没有。现在,我已经重新启动后的Rails,按下按钮,而不是产生一个错误页面,用文字
No route matches [POST] "/session/new"
出于某种原因,Rails已经开始认为的button_to
目标为session#new
,而不是session#create
。就好像它认为它应该调用的HTTP方法是GET而不是POST - 但是,HTML代码显示该方法是post。
顺便说一句,我刚才试了另一件事是给button_to
的动作和方法的参数,如记录here:
<%= button_to "Submit", options: {action: 'create', method: :post} %>
那么这是系统产生什么:
<form action="/session/new?options%5Baction%5D=create&options%5Bmethod%5D=post" class="button_to" method="post">
它没有按”看起来像我想要的,无论是。 button_to
的默认HTTP方法是POST,它出现在结果中,但:options
哈希值刚好加到URL的末尾,而create
这个词在其他地方没有出现。
对this question的第一个回答说,不像文档说的那样,不应该把button_to
的参数放在散列中,而是直接给它们。所以,我想这一点:
<%= button_to "Submit", action: 'create' %>
然而,行动create
仍然没有在生成的HTML显示:
<form action="/session" class="button_to" method="post">
所以,那些东西我尝试使用指定的路径方法之前试过,这工作了一分钟,但出于某种神秘的原因,现在不再了。
任何想法我做错了什么? (这可能是我忽视的一些事情。)
为什么你使用'button_to'而不是simple_forms'submit'按钮? – Noz 2013-02-08 15:52:55
我也早些时候尝试过。我再次尝试:ERB代码'<%= f.submit%>'产生HTML代码'',但点击按钮再次导致错误“无路由匹配[POST]”/ session/new“'。 – 2013-02-08 16:01:05
尝试更改'<%= simple_form_for:session do | f | %>'到'<%= simple_form_for:session,:url => session_index_path%>' – Noz 2013-02-08 16:16:05