我遇到form_for
和fields_for
的问题。
所以,我的问题是:
form_for
,在form_for
内,我使用了fields_for
。在fields_for
内,我使用了form_tag
(我使用了ajax用于此form_tag
)。form_tag
,它只显示form_for
。我不明白为什么。form_tag
。这是我的form_for
:
<div class="row">
<%= form_for @real_estate, url: admin_real_estate_update_path do |f| %>
<%= f.fields_for(:client) do |client| %>
<%= text_field :real_estate, :assessment_start_at, value: @real_estate.assessment_start_at %>
<%= render partial: "admin/real_estate/form/assessment", locals: {real_estate_id: @real_estate.id} %>
<% end %>
<%= f.submit "Submut", class: "btn btn-primary"%>
<% end %>
</div>
这是我放在form_for
内的fields_for
:
<%= form_tag admin_search_assessment_path(real_estate_id), method: :post, remote: true do %>
<%= text_field_tag :company_name, params[:company_name] %>
<%= submit_tag "Submit" %>
<% end %>
我尝试将<form></form>
添加为:
<div class="row">
<%= form_for @real_estate, url: admin_real_estate_update_path do |f| %>
<form></form>
<%= f.fields_for(:client) do |client| %>
<%= text_field :real_estate, :assessment_start_at, value: @real_estate.assessment_start_at %>
<%= render partial: "admin/real_estate/form/assessment", locals: {real_estate_id: @real_estate.id} %>
<% end %>
<%= f.submit "Submut", class: "btn btn-primary"%>
<% end %>
</div>
显示form_tag
,但form_for
未显示。
更新
所以,我使用$("form_2").submit(function() {....});
来解决这个问题。
实际上,我仍然想使用表单嵌套。
答案 0 :(得分:1)
在这个
fields_for
中,我使用了form_tag
(我使用ajax来表示form_tag
)
N&#39; est pas possible,mon ami。
-
以下是它的运作方式......
form_for
和form_tag
两者生成纯HTML表单:
<form action="/action" method="POST">
</form>
许多人对Rails如何运作感到困惑 - 它非常简单。 Rails使用"helper" methods生成浏览器可以读取的纯HTML。
浏览器目前只能理解HTML / CSS。因此,无论何时向Rails发送请求 - 都有来返回该数据,否则就是&#34;网页&#34;根本无法进行处理。
因此,当您询问是否可以嵌套表单时,您必须遵守forms work in pure HTML(spec):
的方式请注意,您不能嵌套FORM元素!
HTML填写表格可用于问卷调查,酒店预订, 订单,数据输入和各种其他应用程序。该 表单被指定为HTML文档的一部分。用户填写 形式,然后提交它。然后,用户代理发送表单 FORM元素指定的内容。通常,这是一个 HTTP服务器,但您也可以通过电子邮件发送表单内容以进 处理
简而言之,这意味着 <form>
标记内的所有都被HTTP计算为一个表单。这意味着,如果您有另一个 <form>
标记,则会导致错误,从而阻止其工作。
你已经知道了(否则你不会提到ajax
)。
您的主要问题是在当前<form></form>
对象中使用<form>
。这会大量混淆HTML,因此我建议复制提交表单,而不使用<form>
对象本身:
#app/views/admin/real_estate/form/assessment.html.erb
<%= text_field_tag "[company_name]", params[:company_name], id: real_estate_id %>
<%= button_tag "Submit", type: "button" , data: { id: real_estate_id } %>
#app/assets/javascripts/application.js
$(document).on("click", "button", function(e){
e.preventDefault();
var real_estate_id = $(this).data("id");
$.ajax({
url: "path/to/real/estate/form/assessment/" + $(this).data("id")),
data: {company_name: $("input[type=text]#" + real_estate_id).val()}
success: function(data) {
//do something on success
},
error: function(data) {
//do something on error
}
});
});
此代码仍会输出您需要的内容。
差异将是双重的:
- 用户将体验相同的功能(
input
仍将存在)- 嵌入的表单将传递给主&#34;表单&#34;提交,但将不会通过您的强params方法(制作它) 对您的控制器不可见)
醇>
实际上,您通过Ajax 复制 HTML表单的功能。虽然我仍然不会这样做,但它会为您提供所需的功能。