- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新:我正在尝试向涉及多个模型的嵌套表单添加/删除表单字段。我看过 Ryan Bates 的“Dynamic Forms”railscast,并且提到了 this article使用Cocoon Gem 。遵循那篇文章后,除了 child_index 之外,一切都完美运行。 child_index 仅出现在第一个 :kid
输入字段 (:name
) 和第一个 :pet
输入字段 (:name
和 :age
)。然后它返回到正在添加的字段的真实性 token 。
我删除了所有 JS 和辅助方法,而是使用一些内置 JS 的 Cocoon 方法。
我通过从 application.html.erb
文件中删除 = javascript_include_tag :cocoon
解决了单击“添加”会添加两个字段而不是一个字段的问题。
我尝试添加 jQuery 和表单助手,但我不确定我输入的代码是否正确。
(我更改了模型对象以使关系更清晰)
父.rb文件:
class Parent < ActiveRecord::Base
has_many :kids
has_many :pets, through: :kids # <<<<<< ADDED KIDS USING 'through:'
kid.rb 文件:
class Kid < ActiveRecord::Base
belongs_to :parent
has_many :pets
accepts_nested_attributes_for :pets, reject_if: :all_blank, allow_destroy: true
validates :name, presence: true
pet.rb 文件:
class Pet < ActiveRecord::Base
belongs_to :kid
validates :name, presence: true
validates :age, presence: true
这是我的 _form.html.erb 文件:
<%= form_for @parent do |f| %>
<% if @parent.errors.any? %>
<div class="alert alert-danger">
<h3><%= pluralize(@student.errors.count, 'Error') %>: </h3>
<ul>
<% @student.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="inline">
<div>
<%= f.fields_for :kids do |kid| %>
<%= render 'kid_fields', f: kid %>
<% end %>
<div>
<%= link_to_add_association "Add Kid", f, :kids, id: 'add_kid',
'data-association-insertion-method' => 'before',
'data-association-insertion-traversal' => 'closest' %>
</div>
<% end %>
</div>
</div>
<div class="form-actions">
<%= f.submit 'Create Parent', class: 'btn btn-primary' %>
</div>
<% end %>
这是我的 _kid_fields.rb 文件:
<div class="nested-fields">
<div class="kid-fields inline">
<%= f.hidden_field :_destroy, class: 'removable' %>
<%= f.text_field :name, class: 'form-control', placeholder: 'Kid's Name', id: 'kid-input' %>
<div>
<%= link_to_remove_association 'Remove Kid', f %>
</div>
<%= f.fields_for :pets do |pet| %>
<%= render 'pet_fields', f: pet %>
<% end %>
</div>
<div>
<%= link_to_add_association "Add Pet", f, :pets, id: 'add_pet',
'data-association-insertion-method' => 'before' %>
</div>
</div>
这是我的 _pet_fields.rb 文件:
<div class="nested-fields">
<div class="pet-fields">
<%= f.hidden_field :_destroy, class: 'removable' %>
<%= f.text_field :name, placeholder: 'Pet Name', id: 'pet-name-input' %>
<%= f.text_field :age, placeholder: 'Pet Age', id: 'pet-age-input' %>
<%= link_to_remove_association 'Remove Pet', f, id: 'remove_pet' %>
</div>
</div>
最佳答案
when I click the "Remove Student" it removes every field above that link
这是您所关注的特定 RailsCast 的一个众所周知的问题(它已过时)。还有一个here :
问题归结为 child_index
fields_for
references的。
每次您使用 fields_for
(这就是您使用上述 javascript 功能复制的内容)时,它都会为它创建的每组字段分配一个 id
。这些ids
在params
中用于分隔不同的属性;它们还被分配给每个字段作为 HTML "id" property .
因此,您遇到的问题是,由于您每次添加新字段时都没有更新此 child_index
,因此它们都是相同的。而且由于您的 link_to_add_fields
帮助程序不会更新 JS(IE 允许您附加具有完全相同的 child_index
的字段),这意味着每当您“删除”一个字段时,它都会将选择所有这些。
解决此问题的方法是设置 child_index
(我将在下面给您解释)。
说实话,我更愿意给你新的代码,而不是挑选过时的东西。
我在这里写过这个(尽管可以稍微修改一下): Rails accepts_nested_attributes_for with f.fields_for and AJAX
有一些 gem 可以为你做到这一点 - 一个叫做 Cocoon非常受欢迎,尽管许多人认为它不是“即插即用”解决方案。
尽管如此,最好知道这一切都是有效的,即使您确实选择使用像 Cocoon
这样的东西...
要理解该解决方案,您必须记住 Rails 创建 HTML 表单。
你可能知道这一点;许多人没有。
这很重要,因为当您意识到 HTML 表单必须遵守 HTML 施加的所有约束时,您就会明白 Rails 并不是魔术师。人们似乎认为。
创建“嵌套”表单(不添加/删除)功能的方法如下:
#app/models/student.rb
class Student < ActiveRecord::Base
has_many :teachers
accepts_nested_attributes_for :teachers #-> this is to PASS data, not receive
end
#app/models/teacher.rb
class Teacher < ActiveRecord::Base
belongs_to :student
end
需要注意的重要一点是您的 accepts_nested_attributes_for
应该在父模型上。也就是说,您将数据传递到的模型(而不是接收数据的模型):
Nested attributes allow you to save attributes on associated records through the parent
#app/controllers/students_controller.rb
class StudentsController < ApplicationController
def new
@student = Student.new
@student.teachers.build #-> you have to build the associative object
end
def create
@student = Student.new student_params
@student.save
end
private
def student_params
params.require(:student).permit(:x, :y, teachers_attributes: [:z])
end
end
构建这些对象后,您就可以在表单中使用它们了:
#app/views/students/new.html.erb
<%= form_for @student do |f| %>
<%= f.fields_for :teachers |teacher| %>
<% # this will replicate for as many times as you've "built" a new teacher object %>
<%= teacher.text_field ... %>
<% end %>
<%= f.submit %>
<% end %>
这是一个标准表单,它将数据发送到您的 Controller ,然后发送到您的模型。模型中的 accepts_nested_attributes_for
方法会将嵌套属性传递给依赖模型。
--
对此最好的办法是记下上面代码创建的嵌套字段的 id
。我手头没有任何例子;它应该显示嵌套字段的名称如 teachers_attributes[0][name]
等。
需要注意的重要事情是 [0]
- 这是 child_index,它在您所需的功能中发挥着至关重要的作用。
动态
现在是动态表单。
第一部分相对简单......删除字段就是从 DOM 中删除它。我们可以使用 child_index
来实现这一点,所以我们首先需要知道如何设置子索引等等等等...
#app/models/Student.rb
class Student < ActiveRecord::Base
def self.build #-> non essential; only used to free up controller code
student = self.new
student.teachers.build
student
end
end
#app/controllers/students_controller.rb
class StudentsController < ApplicationController
def new
@student = Student.build
end
def add_teacher
@student = Student.build
render "add_teacher", layout: false
end
def create
@student = Student.new student_params
@student.save
end
private
def student_params
params.require(:student).permit(:x, :y, teachers_attributes: [:z])
end
end
现在查看 View (请注意,您必须将表单拆分为部分):
#app/views/students/new.html.erb
<%= form_for @student do |f| %>
<%= f.text_field :name %>
<%= render "teacher_fields", locals: {f: f} %>
<%= link_to "Add", "#", id: :add_teacher %>
<%= f.submit %>
<% end %>
#app/views/_teacher_fields.html.erb
<%= f.fields_for :teachers, child_index: Time.now.to_i do |teacher| %>
<%= teacher.text_field ....... %>
<%= link_to "Remove", "#", id: :remove_teacher, data: {i: child_index} %>
<% end %>
#app/views/add_teacher.html.erb
<%= form_for @student, authenticity_token: false do |f| %>
<%= render partial "teacher_fields", locals: {f:f}
<% end %>
这应该为您呈现各种表单等,包括fields_for
。请注意 child_index: Time.now.to_i
- 这为每个 fields_for
设置了唯一的 ID,使我们能够根据您的需要区分每个字段。
让这个动态然后归结为JS:
#config/routes.rb
resources :students do
get :add_teacher, on: :collection #-> url.com/students/get_teacher
end
使用此路由允许我们发送 Ajax 请求(以获取新字段):
#app/assets/javascripts/.....coffee
$ ->
#Add Teacher
$(document).on "click", "#add_teacher", (e) ->
e.preventDefault();
#Ajax
$.ajax
url: '/students/add_teacher'
success: (data) ->
el_to_add = $(data).html()
$('#subscribers').append(el_to_add)
error: (data) ->
alert "Sorry, There Was An Error!"
#Remove Teacher
$(document).on "click", "#remove_teacher", (e) ->
e.preventDefault();
id = $(this).data("i")
$("input#" + i).remove()
关于jquery - rails 4 : Adding child_index to dynamically added (nested) form fields with Cocoon Gem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32984498/
我有一个场景,我们必须通过 Azure AD 对企业用户进行身份验证,但通过 Azure AD B2C 对外部用户进行身份验证——所有这些都来自同一个登录屏幕。 有一些 Web 应用程序将共享此功能。
在使用 Azure AD B2C 和 Azure AD B2B 之前,我通常会将应用程序添加到我们租户的 Azure AD 中,并且 Office 365 用户可以使用其帐户 (SSO) 访问应用程序
当 Azure Active Directory 信任访问本地 Active Directory 用户时,我们是否可以使用本地 AD 用户名(域限定的 sam 帐户名称,例如:cosmos\brahm
什么是在网站上展示广告的好托管广告管理器? 我听说过OpenX ,但从未使用过。 最佳答案 我们使用名为 Ad Serving Solutions http://www.adservingsoluti
是否可以将用户从云 Azure Active Directory 同步到本地 AD? On Premises 这里有点错误,因为它实际上是 Azure 中的虚拟网络,带有 Windows Server
我正在关注这里的答案:Multi-Tenant Azure AD Auth in Azure AD B2C with Custom Policies 以及这里的演练:https://github.co
我正在尝试使用/common Azure AD 端点在 Azure AD B2C 中使用 Azure AD Auth。根据How to sign in any Azure Active Directo
来自 Mercurial 文档: The manifest is the file that describes the contents of the repository at a particu
我正在尝试将 firebase admob 与 React Native 集成到我的应用程序中,一切都适用于 testID横幅 ('ca-app-pub-3940256099942544/293473
我有一个应用程序需要根据其本地 AD 通用名称来过滤权限。几点注意事项: Azure AD Connect 正在 OnPrem AD 和 Azure 之间同步数据 我已成功将登录用户的组信息从 Azu
我正在使用 blogspot 平台并在我的网站上使用了 Google Adsense。我想对齐一个自动 Adsense 广告,它根本不居中,而带有代码的广告则完全没有问题。它只是自动广告,有人可以帮助
为什么redirect URL必须完全匹配?在域级别进行匹配是否不足以提供适当的安全性? 如果我有数百条路径怎么办? 示例网址: https://myawesomesite.com https://m
我即将创建一个新的 Azure AKS 群集,并且希望将 AKS 与 Azure Key Vault 集成。几个月前,在学习阶段,我看到需要使用Azure AD pod管理的身份来做到这一点,但现在我
我正在尝试配置我的 Azure AD 以同步我的本地 AD DS,如果在 Microsoft Azure AD 中添加任何用户,它应该自动在我的本地 AD 中注册。 我已创建 Azure AD 并配置
我有大约 50 个用户的 Azure AD。这些用户是我们购买Office365时创建的。假设 Azure AD 上的域是 example.com。 ([email protected])在本地,我们
我正在尝试获取组 Azure AD 的名称,Azure 登录 (openId) 后的内部 token 我收到 json 格式的组 ID,但我需要组名称。 登录后的Json: Claims 尝试使用Gr
我们希望将 Azure AD B2C 用于我们的 Web 应用程序,以允许用户使用其公司 ADFS 帐户登录。 根据Azure Active Directory B2C: Add ADFS as a
首先,我无法了解为什么需要这些数据,也无法了解有关网络的细节。您必须相信我,除了运行 LDAP 查询的 PowerShell 脚本之外,没有其他方法可以获取这些数据。 我正在使用具有多个林和多个域的网
我是一个相当新的 PS 用户...正在寻求有关 powershell 脚本的帮助来获取用户所属的安全组列表。 描述我需要什么: 我有包含许多用户(samaccountnames)的输入列表(txt 文
我有两个要存储在目录中以供我的应用程序使用的声明。这些内容不可供用户编辑,但可用于应用程序从 token 中读取。 内置策略可以检索声明,但是,使用自定义策略检索这些声明没有取得任何成功。 通读文章“
我是一名优秀的程序员,十分优秀!