form_for被放在fields_for中

时间:2015-11-11 05:03:14

标签: ruby-on-rails ruby-on-rails-4

我遇到form_forfields_for的问题。

所以,我的问题是:

  • 我有form_for,在form_for内,我使用了fields_for。在fields_for内,我使用了form_tag(我使用了ajax用于此form_tag)。
  • 但是当我查看生成的HTML时,它没有显示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() {....});来解决这个问题。 实际上,我仍然想使用表单嵌套。

1 个答案:

答案 0 :(得分:1)

  

在这个fields_for中,我使用了form_tag(我使用ajax来表示form_tag

N&#39; est pas possible,mon ami。

-

以下是它的运作方式......

form_forform_tag 两者生成纯HTML表单:

<form action="/action" method="POST">
</form>

许多人对Rails如何运作感到困惑 - 它非常简单。 Rails使用"helper" methods生成浏览器可以读取的纯HTML。

浏览器目前只能理解HTML / CSS。因此,无论何时向Rails发送请求 - 都有来返回该数据,否则就是&#34;网页&#34;根本无法进行处理。

因此,当您询问是否可以嵌套表单时,您必须遵守forms work in pure HTMLspec):

的方式
  

请注意,您不能嵌套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
      }
   });
});

此代码仍会输出您需要的内容。

差异将是双重的:

  
      
  1. 用户将体验相同的功能(input仍将存在)
  2.   
  3. 嵌入的表单将传递给主&#34;表单&#34;提交,将不会通过您的强params方法(制作它)   对您的控制器不可见)
  4.   

实际上,您通过Ajax 复制 HTML表单的功能。虽然我仍然不会这样做,但它会为您提供所需的功能。