Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-如何发送另一个表单中的表单?_Ruby On Rails_Ruby_Forms_Nested Forms - Fatal编程技术网

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

Ruby on rails Rails-如何发送另一个表单中的表单?,ruby-on-rails,ruby,forms,nested-forms,Ruby On Rails,Ruby,Forms,Nested Forms,我认为这种结构: <%= simple_form_for @user ... %> ... ... <%= render '/hobbies/form', :user => @user %> ... ... <% end %> ... ... @用户%> ... ... 渲染部分从部分加载数据-有一个表单。表单字段已成功加载(如输入、提交输入、单选按钮等),但当我查看生成的HTML时,呈现的表单中缺少嵌套表单。要实现这一点,您必

我认为这种结构:

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

...
...
@用户%>
...
...

渲染部分从部分加载数据-有一个表单。表单字段已成功加载(如输入、提交输入、单选按钮等),但当我查看生成的HTML时,呈现的表单中缺少嵌套表单。要实现这一点,您必须取消表单嵌套或使用javascript。如果您选择javascript方法,则只需捕获表单提交事件,阻止默认值,然后手动提交所需的表单

编辑:

如果你选择JavaScript方法,考虑你可能根本不需要两个表单。相反,您可以为发出ajax请求的“子操作”上的按钮添加一个单击处理程序


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

表单中不能有表单。如果您的关联设置正确,请执行类似操作

class User < ActiveRecord::Base
  has_many :hobbies

  accepts_nested_attributes_for :hobbies
end

class Hobby < ActiveRecord::Base
  belongs_to :user
end
这会给你带来像

users_attributes: { name: "xyz", hobbies_attributes: { attribute: "value"} }  

有关签出的详细信息

很简单,您不能有两个单独的嵌套表单

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

--

表格

您需要知道的最重要的一点是Rails只是构建—这意味着它们必须遵守这些表单规定的所有约束和规则:

每个表单都有自己的
action
属性,这就是浏览器知道数据发送到哪里的方式。如果您有多个/嵌套表单,那么基本上您将有两个“action”属性;阻止HTML正确发送表单

--

嵌套的

如果您想使用一些Rails约定,最好使用
accepts\u nested\u attributes\u for
方法。这驻留在模型中,为了有效地使用它,您需要确保您的设置正确:

#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

您不能有两个嵌套表单,您需要将内部表单移出。正如下面@thedeeno的回答所指出的,您可以使用JavaScript实现类似于嵌套表单的功能。非常有用,谢谢您,先生-您知道或有任何示例说明如何:“捕获表单提交事件,阻止默认设置,并手动提交所需表单。”?这将非常有用
#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
#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
<%= form_for @user do |f| %>
   <%= f.fields_for :hobbies do |h| %>
       <%= h.text_field :your_attributes %>
   <% end %>
<% end %>