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

时间:2014-08-02 14:11:51

标签: ruby-on-rails ruby forms nested-forms

我认为我有这种结构:

<%= simple_form_for @user ... %>
  ...
  ...
  <%= render '/hobbies/form', :user => @user %>
  ...
  ...
<% end %>

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

这意味着当我点击渲染表单中的提交按钮时,不会发送此呈现的表单,而是发送出来的“大” - simple_form_for

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

谢谢

3 个答案:

答案 0 :(得分:13)

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

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

-

<强>表单

你需要知道的最重要的事情是Rails只是构建HTML forms - 这意味着他们必须遵守所有约束条件。这些表格规定的规则:

enter image description here

每个表单都有自己的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

关联的重要性至关重要--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

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

<%= form_for @user do |f| %>
   <%= f.fields_for :hobbies do |h| %>
       <%= h.text_field :your_attributes %>
   <% end %>
<% end %>

答案 1 :(得分:6)

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

编辑:

如果您选择使用javascript方法,请考虑您可能根本不需要两个表单。相反,您只需在“子操作”按钮上添加按钮的点击处理程序即可。这是一个ajax请求。

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

答案 2 :(得分:2)

您不能在表单中包含表单。如果您的关联正确设置了类似

的内容
class User < ActiveRecord::Base
  has_many :hobbies

  accepts_nested_attributes_for :hobbies
end

class Hobby < ActiveRecord::Base
  belongs_to :user
end

然后您可以在表单中使用fields_for,例如

<%= form_for @user do |u| %>
  // user fields
  <%= u.fields_for :hobbies do |h| %>
    // hobbies fields
  <% end %>
  <%= f.submit %>
<% end %>

这会给你像

这样的参数
users_attributes: { name: "xyz", hobbies_attributes: { attribute: "value"} }  

详情结帐accept_nested_attributes_for