Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 按钮“u to”仅间歇工作,通常会导致“u to”;“没有路线”;错误_Ruby On Rails_Button To - Fatal编程技术网

Ruby on rails 按钮“u to”仅间歇工作,通常会导致“u to”;“没有路线”;错误

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制作一个简单的登录表单。我尝试了几种编码表单提交按钮的方法,但由于缺少路由错误,每种方法都失败了。我得到了一个工作方法,并签入了我的代码。然而,现在同样的代码失败

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="&#x2713;" />
    <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="&#x2713;" />
    <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