2

改写

我有2个模型。应用程序和对话。一个应用包含多个对话

resources :apps do
    resources :conversations
end

我有一个单一的视图,上面有 2 个表单,使用标签的表单。第一种形式用于更新应用模型。另一个用于创建或更新对话。

我遇到的问题是,当我使用 form_for 标记时,生成的 html 不会生成 _method 输入。

EG 对话表。

<form accept-charset="UTF-8" action="/apps/50c87614e976a31149000009/conversations" class="new_conversation ng-pristine ng-valid" id="new_conversation" method="post">

 <div style="margin:0;padding:0;display:inline">
<input name="utf8" type="hidden" value="✓">
<input name="authenticity_token" type="hidden" value="RqwwgBb737uuwg3PgRS+z0qlOP1aDqWe+2hrEeU0KHk=">
</div>

申请表

<form accept-charset="UTF-8" action="/apps/50c87614e976a31149000009" class="edit_app ng-pristine ng-valid" enctype="multipart/form-data" id="edit_app_50c87614e976a31149000009" method="post">
<div style="margin:0;padding:0;display:inline">
<input name="utf8" type="hidden" value="✓">
<input name="_method" type="hidden" value="put">
<input name="authenticity_token" type="hidden" value="RqwwgBb737uuwg3PgRS+z0qlOP1aDqWe+2hrEeU0KHk="></div>

现在让我们只关注对话模型,因为这是有问题的模型。

从上面的 html 中,您会期望 Conversation 表单应该发送一个 post 请求。不幸的是,当它被 rails 应用程序接收时,它被视为 puts 请求。

查看 form_for 的文档,我知道 form_for 应该设置一个名为 _method 的隐藏输入字段。

如果您查看 Conversation 表单并将其与 App 表单进行比较,您可以看到该会话没有 _method 属性。我无法确定这是为什么。

有没有人知道为什么这被忽略了?或者为什么当我提交对话表单时,发送的是 put 而不是 post?

4

1 回答 1

0

Rails 实现了一个 HTTP put as post 表单,其中包含一个名为的隐藏输入_method,其值为put. 您应该会看到表单中隐藏的输入被作为 PUT 请求处理。

form_for当它为其创建表单的对象已经存在时,将生成一个放置表单。

于 2012-12-20T12:09:23.017 回答