2013-02-08 29 views
2

添加于编辑,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&amp;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"> 

所以,那些东西我尝试使用指定的路径方法之前试过,这工作了一分钟,但出于某种神秘的原因,现在不再了。

任何想法我做错了什么? (这可能是我忽视的一些事情。)

+0

为什么你使用'button_to'而不是simple_forms'submit'按钮? – Noz 2013-02-08 15:52:55

+0

我也早些时候尝试过。我再次尝试:ERB代码'<%= f.submit%>'产生HTML代码'',但点击按钮再次导致错误“无路由匹配[POST]”/ session/new“'。 – 2013-02-08 16:01:05

+0

尝试更改'<%= simple_form_for:session do | f | %>'到'<%= simple_form_for:session,:url => session_index_path%>' – Noz 2013-02-08 16:16:05

回答

1

这个问题最有可能是我创建应用程序后,我决定改变几个类和关联文件的名称。这导致类和文件名不遵循Rails约定在某些情况下对名词进行复数化。例如,我有一个文件session_controller.rb,其中包含一个名为SessionController的类;正确的名字是sessions_controller.rbSessionsController

我创建了一个虚拟Rails应用程序,然后命令rails generate scaffold AtUserrails generate scaffold Session,然后使用生成的文件名和标识符作为纠正实际应用程序的指南。现在,我不再有那些“无路线”的错误了。该命令rake routes输出:

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前者在后者的顶部。执行重命名修复程序后,我试图重现此错误,并重新发生:当实际问题是缺少require语句时,Rails错误地报告了缺少路由。这表明Rails的错误报告机制是错误的。

感谢用户牛蛙将我指向正确的方向。

1

button_to文档实际上在几个地方是错误的(注意我的答案在这里:Why is this button_to rendering incorrectly in Rails 3.2.11?)。为了解决这个问题提交按钮,使用此:

<%= button_to "Submit", { action: 'create' }, method: :post %> 

optionshtml_options散列必须使用{}括号取决于你要完成的定义明确的分离。

create操作不会显示在URL中,因为POST HTTP方法将/session路由到create操作。

+0

我刚刚尝试过,不幸的是,它没有任何区别:生成的HTML仍然是'

'。 (顺便说一句,我已经确定在两次尝试之间停止并重新启动Rails服务器,以避免任何缓存错误的可能性。) – 2013-02-08 15:53:03

+0

回答你的编辑:是的,路径应该工作 - 现在它工作!所以问题不在于我没有错误地使用'button_to',而是Rails的行为不一致,有时将生成的HTML表单解释为'/ session/create'的链接,有时则解释为'/ session/new' 。 – 2013-02-08 15:56:37

1

到目前为止,评论由Cyle建议的方法上面,似乎最好的工作,即增加url: session_index_pathsimple_form_for声明:

<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按钮会产生“无路由”错误,甚至尽管按钮的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> 

因此,迄今为止,这可能只是运气。

相关问题