Rails - 如何发送另一个表单中的表单?

use*_*621 6 ruby forms ruby-on-rails nested-forms

我认为我有这种结构:

<%= simple_form_for @user ... %>
  ...
  ...
  <%= render '/hobbies/form', :user => @user %>
  ...
  ...
<% end %>
Run Code Online (Sandbox Code Playgroud)

渲染部分从部分加载数据 - 这是一个表单.表单字段已成功加载(如输入,提交输入,单选按钮等),但是当我查看生成的HTML时,缺少呈现的表单<%= form_for...和结束标记.

这意味着当我从渲染表单中单击提交按钮时,此渲染表单不会被发送出去,而是发送出来的"大"表示 - simple_form_for.

如何使渲染的表格可发送?

谢谢

Ric*_*eck 13

简单地说,您不能拥有两个单独的嵌套表单.

可以使用嵌套关联表单accepts_nested_attributes_for- 这取决于后端模型的结构,我将在下面详细说明.

-

形式

你需要知道的最重要的事情是Rails的只是建立HTML表单 -这意味着他们必须通过所有的约束遵守和规则这些形式规定:

在此输入图像描述

每个表单都有自己的 action属性 - 这就是浏览器知道发送数据的位置.如果你有多个/嵌套表单,你基本上会有两个这样的"动作"属性; 阻止HTML正确发送表单

-

嵌套

如果你想使用一些Rails约定,你将更好地使用该accepts_nested_attributes_for方法.这属于模型,为了有效地使用它,您需要确保ActiveRecord associations正确设置:

#app/models/user.rb
Class User < ActiveRecord::Base
   has_many :hobbies
   accepts_nested_attributes_for :hobbies
end

#app/models/hobby.rb
Class Hobbies < ActiveRecord::Base
   belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

关联的重要性至关重要--Rails会将"嵌套"模型数据传递给对方.只有模型与ActiveRecord正确关联时,嵌套模型数据才会出现(如上所述)

然后,您可以通过控制器/模型传递数据,如下所示:

#app/controllers/users_controller.rb
Class UsersController < ApplicationController
   def new
       @user = User.new
       @user.hobbies.build # -> essential for nested attributes 
   end

   def create
      @user = User.new(user_params)
      @user.save #-> notice how this saves the @user model only?
   end

   private

   def user_params
      params.require(:user).permit(:user, :attributes, hobbies_attributes: [:hobbies, :attributes])
   end
end
Run Code Online (Sandbox Code Playgroud)

这将允许您包括hobbies表单的一部分,如下所示:

<%= form_for @user do |f| %>
   <%= f.fields_for :hobbies do |h| %>
       <%= h.text_field :your_attributes %>
   <% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)


Dan*_*nor 6

嵌套表单无效html.要实现此目的,您必须取消嵌套表单或使用javascript.如果您选择javascript方法,则只需捕获表单提交事件,阻止默认值,并手动提交所需的表单.

编辑:

如果您选择javascript方法,请考虑您可能根本不需要两个表单.相反,您只需为"子操作"上的按钮添加一个单击处理程序,它就会产生一个ajax请求.

或者,如果javascript不是一个选项,并且重新排列html不是一个选项,您可以通过从两个表单提交数据并根据单击的提交输入进行不同的处理来在服务器上处理此问题.