ruby-on-rails - Button_to 仅间歇性地工作,并且经常导致 "no route"错误

标签 ruby-on-rails button-to

2013 年 2 月 11 日编辑时添加:

我应该更清楚地表明,我遇到的问题并不是我无法获取我编写的 ERB 代码来生成正确的 HTML 代码。相反,我的 Rails 安装有时会正确解释 HTML 代码,因此单击链接会产生正确的效果,有时会错误地产生“无路由”错误。更多详细信息请参阅下面我的回答。

原始问题,2013-02-08:

我正在使用 Rails 3.2.11 制作一个简单的登录表单。我尝试了多种对表单的“提交”按钮进行编码的方法,但由于缺少路由错误,每种方法都失败了。我找到了一种可行的方法,并 checkin 了我的代码。然而,现在相同的代码失败了。

这是 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

这是命令rake paths 输出的内容:

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,这应该会导致调用 SessionControllercreate 方法——有一段时间,确实如此。现在,在我重新启动 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">

所以,这些是我在尝试使用命名路径方法之前尝试过的事情,它工作了一分钟,但由于某种神秘的原因,不再起作用了。

你知道我做错了什么吗? (这可能是我忽略的明显事情。)

最佳答案

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 中,因为 /sessionPOST HTTP 方法被路由到 创建操作。

关于ruby-on-rails - Button_to 仅间歇性地工作,并且经常导致 "no route"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14776089/

相关文章:

ruby-on-rails - 使用 omniauth 进行 Facebook 身份验证

ruby-on-rails - 我如何测试 ActionMailer?

ruby-on-rails - rails, view 为 button_to 而不是 link_to 换行

ruby-on-rails - RoR 如何获取/needs/4 而不是/needs.4 的button_to 路径?

ruby-on-rails - 如何在 Rails 6 中配置 Jasmine?

ruby-on-rails - Rails 路由 : namespace nested in a scope

ruby-on-rails - 如何使用 Ruby 的 File.open 命令编辑 *nix 系统文件?

ruby-on-rails - 《敏捷 Web 开发 Rails 4 - 第 11 章》一书中的 Rails 远程调用内部服务器错误 500

ruby-on-rails - rails : Can I test for the presence of a button_to?

ruby-on-rails - :confirm in rails not working