gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:12:08 25 4
gpt4 key购买 nike

在编辑时添加,2013-02-11:

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

原始问题,2013-02-08:

我正在使用 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

这是命令 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 ,这应该会导致 create SessionController的方法被称为 - 有一段时间,它确实如此。现在,在我重新启动 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 中,因为 POST HTTP 方法到 /session路由到 create行动。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com