Ruby on rails Rails 5-如何使用autocomplete将嵌套对象动态添加到表单中

Ruby 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

我有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
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
    仅在
    teamscoontroller
    中的新操作中运行,并且Rails不记得在AJAX尝试创建
    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