Ruby on rails 按钮“u to”仅间歇工作,通常会导致“u to”;“没有路线”;错误
2013年2月11日编辑时增加: 我应该更清楚地说明,我遇到的问题并不是我无法获得我编写的ERB代码来生成正确的HTML代码。相反,我的Rails安装有时会正确解释HTML代码,因此单击链接会产生正确的效果,有时会产生错误的“无路由”错误。更多细节,请参阅下面我的回答 原始问题,2013-02-08: 我正在使用Rails 3.2.11制作一个简单的登录表单。我尝试了几种编码表单提交按钮的方法,但由于缺少路由错误,每种方法都失败了。我得到了一个工作方法,并签入了我的代码。然而,现在同样的代码失败了 这是Ruby on rails 按钮“u to”仅间歇工作,通常会导致“u to”;“没有路线”;错误,ruby-on-rails,button-to,Ruby On Rails,Button To,2013年2月11日编辑时增加: 我应该更清楚地说明,我遇到的问题并不是我无法获得我编写的ERB代码来生成正确的HTML代码。相反,我的Rails安装有时会正确解释HTML代码,因此单击链接会产生正确的效果,有时会产生错误的“无路由”错误。更多细节,请参阅下面我的回答 原始问题,2013-02-08: 我正在使用Rails 3.2.11制作一个简单的登录表单。我尝试了几种编码表单提交按钮的方法,但由于缺少路由错误,每种方法都失败了。我得到了一个工作方法,并签入了我的代码。然而,现在同样的代码失败
app/views/session/new.html.erb
的代码(我使用的是simple\u form
,但不是它的按钮包装):
这是命令rake路由
输出的内容:
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
at_users GET /at_users(.:format) at_users#index
POST /at_users(.:format) at_users#create
new_at_user GET /at_users/new(.:format) at_users#new
edit_at_user GET /at_users/:id/edit(.:format) at_users#edit
at_user GET /at_users/:id(.:format) at_users#show
PUT /at_users/:id(.:format) at_users#update
DELETE /at_users/:id(.:format) at_users#destroy
sessions POST /sessions(.:format) sessions#create
new_session GET /sessions/new(.:format) sessions#new
session DELETE /sessions/:id(.:format) sessions#destroy
login /login(.:format) sessions#new
logout /logout(.:format) sessions#destroy
root / main#index
button\u to
的目标路径是session\u index\u path
,这将导致调用SessionController
的create
方法,并且在一段时间内,它确实调用了该方法。现在,在我重新启动Rails之后,按下按钮会生成一个错误页面,其中包含文本
No route matches [POST] "/session/new"
出于某种原因,Rails开始认为按钮u to
的目标是会话#新建
,而不是会话#创建
。这就好像它认为应该调用的HTTP方法是GET而不是POST——然而,HTML代码显示该方法是POST
顺便说一下,我之前尝试过的另一件事是为操作和方法参数提供按钮,如文档所示:
但是,操作create
仍不会显示在生成的HTML中:
<form action="/session" class="button_to" method="post">
所以,在尝试使用命名路径方法之前,我就尝试过这些方法,它工作了一分钟,但由于某种神秘的原因,不再有效
知道我做错了什么吗?(这可能是我忽略的一个明显的问题。)文档的按钮实际上在一些地方是错误的(注意我的答案:)。要修复“提交”按钮,请使用以下命令:
<%= button_to "Submit", { action: 'create' }, method: :post %>
选项
和html\u选项
散列需要使用{}
大括号定义显式分隔,具体取决于您试图完成的任务
create
操作不会显示在URL中,因为POST
HTTP方法到/session
被路由到create
操作。到目前为止,Cyle在上面的评论中建议的方法似乎效果最好,即,将url:session\u index\u path添加到simple\u表单中,用于声明:
<h2>Log in</h2>
<%= simple_form_for :session, url: session_index_path do |f| %>
<%= f.input :username %>
<%= f.input :password %>
<%= button_to "Submit" %>
<% end %>
登录
我还没有在点击由该代码生成的“提交”按钮时遇到路由错误
我不接受这个答案,因为我还没有解决的基本问题是Rails的易变性;也就是说,以前工作过的代码突然停止工作。例如,今天我首先尝试了以下代码:
<%= simple_form_for :session do |f| %>
<%= f.input :username %>
<%= f.input :password %>
<%= button_to "Submit1" %>
<%= button_to "Submit2", session_index_path %>
<% end %>
按下“Submit2”按钮可以工作。但是,当我删除包含按钮“Submit1”的行时,停止并重新启动Rails服务器(每次尝试之间我都会这样做),然后重新加载页面,按下Submit2按钮会产生“No route”错误,尽管按钮的HTML代码保持不变:
<form action="/session" class="button_to" method="post">
<div>
<input type="submit" value="Submit2" />
<input name="authenticity_token" type="hidden" value="...this value was the same also..." />
</div>
</form>
非常令人费解。可能与我的设置细节有关,尽管它没有那么奇特
编辑时添加:
当我查看由Cyle方法生成的HTML的相关部分时,我注意到它与几乎所有其他情况相同:
<form accept-charset="UTF-8" action="/session" class="simple_form session" method="post" novalidate="novalidate">
<div style="margin:0;padding:0;display:inline">
<input name="utf8" type="hidden" value="✓" />
<input name="authenticity_token" ... />
</div>
...the username and password input fields...
<form action="/session" class="button_to" method="post">
<div>
<input type="submit" value="Submit" />
<input name="authenticity_token" type="hidden" value="voOGIAbJfwvjxVRbk02V5l6zn6iwvOiMvaeauPBIrqU=" />
</div>
</form>
…用户名和密码输入字段。。。
因此,到目前为止,这可能只是我的运气。问题很可能是在我创建应用程序后,我决定更改几个类和相关文件的名称。这导致类和文件名在某些上下文中不遵循Rails关于名词复数化的约定。例如,我有一个文件session\u controller.rb
,其中包含一个名为SessionController
的类;正确的名称是sessions\u controller.rb
和sessioncontroller
我创建了一个虚拟Rails应用程序,然后命令Rails generate scaffold AtUser
和Rails generate scaffold Session
,然后使用生成的文件名和标识符作为更正实际应用程序的指南。现在,我再也没有那些“没有路线”的错误了。命令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
at_users GET /at_users(.:format) at_users#index
POST /at_users(.:format) at_users#create
new_at_user GET /at_users/new(.:format) at_users#new
edit_at_user GET /at_users/:id/edit(.:format) at_users#edit
at_user GET /at_users/:id(.:format) at_users#show
PUT /at_users/:id(.:format) at_users#update
DELETE /at_users/:id(.:format) at_users#destroy
sessions POST /sessions(.:format) sessions#create
new_session GET /sessions/new(.:format) sessions#new
session DELETE /sessions/:id(.:format) sessions#destroy
login /login(.:format) sessions#new
logout /logout(.:format) sessions#destroy
root / main#index
在此之前,当我在另一个文件中包含一个文件而没有require
d前一个文件位于后一个文件的顶部时,我还看到了一个“No-route”错误。在执行重命名修复后,我试图重现此错误,但它确实再次出现:Rails错误地报告了丢失的路由,而实际问题是缺少require
语句。这表明Rails的错误报告机制存在缺陷
感谢用户bullfrog为我指明了正确的方向。为什么你要使用按钮来而不是简单的表单提交按钮?我之前也试过了。我刚刚又试了一次:ERB代码生成HTML代码,但再次单击按钮会导致错误无路由匹配[POST]“/session/new”
。尝试将
更改为会话索引路径%>
,再加上
,就可以了。现在。就像之前有其他事情一样,只是偶尔会发生。我会修改我的问题使问题更清楚。只是想知道。。Rails的约定是使用复数控制器名。所以你的资源
<%= simple_form_for :session do |f| %>
<%= f.input :username %>
<%= f.input :password %>
<%= button_to "Submit1" %>
<%= button_to "Submit2", session_index_path %>
<% end %>
<form action="/session" class="button_to" method="post">
<div>
<input type="submit" value="Submit2" />
<input name="authenticity_token" type="hidden" value="...this value was the same also..." />
</div>
</form>
<form accept-charset="UTF-8" action="/session" class="simple_form session" method="post" novalidate="novalidate">
<div style="margin:0;padding:0;display:inline">
<input name="utf8" type="hidden" value="✓" />
<input name="authenticity_token" ... />
</div>
...the username and password input fields...
<form action="/session" class="button_to" method="post">
<div>
<input type="submit" value="Submit" />
<input name="authenticity_token" type="hidden" value="voOGIAbJfwvjxVRbk02V5l6zn6iwvOiMvaeauPBIrqU=" />
</div>
</form>
at_users GET /at_users(.:format) at_users#index
POST /at_users(.:format) at_users#create
new_at_user GET /at_users/new(.:format) at_users#new
edit_at_user GET /at_users/:id/edit(.:format) at_users#edit
at_user GET /at_users/:id(.:format) at_users#show
PUT /at_users/:id(.:format) at_users#update
DELETE /at_users/:id(.:format) at_users#destroy
sessions POST /sessions(.:format) sessions#create
new_session GET /sessions/new(.:format) sessions#new
session DELETE /sessions/:id(.:format) sessions#destroy
login /login(.:format) sessions#new
logout /logout(.:format) sessions#destroy
root / main#index