Ruby on rails Rails 5-如何使用autocomplete将嵌套对象动态添加到表单中
我有3个模型-团队、用户和团队用户(名称:至)。以编辑和新建团队的形式,使用自动完成输入动态添加此团队的成员 app/models/user.rbRuby on rails Rails 5-如何使用autocomplete将嵌套对象动态添加到表单中,ruby-on-rails,ajax,autocomplete,nested-forms,has-many-through,Ruby On Rails,Ajax,Autocomplete,Nested Forms,Has Many Through,我有3个模型-团队、用户和团队用户(名称:至)。以编辑和新建团队的形式,使用自动完成输入动态添加此团队的成员 app/models/user.rb class User < ApplicationRecord has_many :team_users has_many :teams, through: :team_users accepts_nested_attributes_for :team_users, :teams, allow_destroy: true end c
class User < ApplicationRecord
has_many :team_users
has_many :teams, through: :team_users
accepts_nested_attributes_for :team_users, :teams, allow_destroy: true
end
class用户
app/models/team.rb
class Team < ApplicationRecord
has_many :team_users
has_many :users, through: :team_users
accepts_nested_attributes_for :team_users, allow_destroy: true, reject_if: proc { |a| a['user_id'].blank? }
end
class团队
app/models/team_user.rb
class TeamUser < ApplicationRecord
belongs_to :team
belongs_to :user
accepts_nested_attributes_for :team, :user, allow_destroy: true
end
class TeamUser
我需要这样的东西:
我的问题是:
- Cocoon Gem只生成空字段,或者在渲染模板时创建空字段。我需要找到一个用户并将其添加到团队中(在不可编辑的字段中)
- 如果我使用AJAX,则
仅在@team=team.new
中的新操作中运行,并且Rails不记得在AJAX尝试创建teamscoontroller
对象时创建了team\u user
。要创建@team
模型的对象,需要运行team\u user
。我从自动完成字段中获取的@team.team\u users.build(user\u id:params[:user\u id])
,但不知道用户id
和@team
(例如,在团队id
新建
操作
)团队控制器
- 1
在这个示例应用程序中,我使用cocoon、simpleform和select2创建一个可搜索的下拉框,以搜索姓名列表,将乘客添加到租赁记录中
我相信这就是您想要的用例
实现这一点的部分是:
它使用cocoon回调为每个新乘客运行select2查找
在这方面,协会包括:
belongs_to :customer
belongs_to :vehicle
# delete associated records..
has_many :passengers, dependent: :destroy
has_many :pasenger_lists, :through => :passengers, :class_name => 'PasengerList'
accepts_nested_attributes_for :pasenger_lists
accepts_nested_attributes_for :passengers, allow_destroy: true
激活select2下拉列表的回调如下:
在代码中,您是否在强参数中列出了所需的项目?请看这里:
二,
我在这个应用程序中也有同样的想法:
它只是不同型号的rail263应用程序。这是同样的道理。我使用rail263来开发用于培训应用程序的想法
您可以在此处试用培训应用程序:-使用user=reg和password=a2a2登录
-单击
添加tr\u培训\u员工
按钮查看其工作情况
三, 如果你对这个想法感兴趣,我可以和你一起编辑这篇文章,包括一个更完整的答案,并解释它是如何为以后可能阅读这篇文章的任何人工作的。让我知道
相关:我使用cocoon for嵌套属性和AngularJS与jQuery()解决了一个非常类似的问题。有一些要点: 每次选择某项内容时,使用Angular/jQuery更新
数据关联插入模板
和更新相关的数据()。由于浏览器缓存数据元素的特性,此属性中的更改不会自动反映。因此,我开始点击按钮的事件:
$(this).data('association-insertion-template', $(this).attr('data-association-insertion-template'));
为cocoon编写相应的嵌套字段模板,以便使用选定的值填充它。当我使用Angular时,我的是(模板语法):
该前端原型几乎工作正常,但在每个父对象的更新中,所有现有嵌套字段都加倍。因此,我在父模型中重写了嵌套属性方法(请参见):
最后一个问题是,我能够多次添加嵌套记录。为了限制这种行为,我只需删除typeahead AJAX查询中所有已经使用的ID
希望这有帮助 如果你有类似的项目,你可以用这个gem解决这个问题在本例中,每次添加一个新字段时,为新用户选择输入。该应用程序推荐了很多用户,因此使用select input引入所有用户是不合理的。不幸的是,这不是我所需要的。在我的应用程序中,需要一个主窗体中的搜索框,用户可以通过它进行搜索。一旦进入带有autocomplete的字段,找到用户,您必须按enter键或从下拉列表中选择它。然后,该用户应该出现在团队中的用户列表中(没有问题图片中的选项)。我想我需要AJAX,但我不知道如何在TeamsController中的new
操作中保存@team
team\u user
@team.team\u users.build(user\id:params[:user\u id])
在另一个AJAX.OK中,现在我看到了区别。我希望其他人能帮你。你看过自动完成吗?
params.require(:rental_record).permit(
:customer_id, :vehicle_id, :start_date, :end_date, :lastUpdated,
passengers_attributes: [:id, :description, :name, :output, :pasenger_list_id, :_destroy , pasenger_lists_attributes: [:id, :clocknum, :name, :active, :_destroy]]
)
$(this).data('association-insertion-template', $(this).attr('data-association-insertion-template'));
tr.nested-fields
td
= f.object.persisted? ? f.object.full_name : '{{angularModel.full_name}}'
def items_attributes=(attributes)
self.items = attributes.values.map { |item| Item.find(item['id']) }
super(attributes)
end