Jquery rails5和AJAX-can';不要自动完成并保存嵌套表单

Jquery rails5和AJAX-can';不要自动完成并保存嵌套表单,jquery,ruby-on-rails,ajax,autocomplete,Jquery,Ruby On Rails,Ajax,Autocomplete,有一个团队模型,其中有很多用户。用户与团队模型相关联,如has\u many:to。 搜索用户时需要使字段自动完成,选择用户时需要添加嵌套字段 app/controllers/teams\u controller.rb class TeamsController < ApplicationController # GET /teams/new def new @team = Team.new #(parent_id: params[:parent_id]) end

有一个团队模型,其中有很多用户。用户与团队模型相关联,如
has\u many:to
。 搜索用户时需要使字段自动完成,选择用户时需要添加嵌套字段

app/controllers/teams\u controller.rb

class TeamsController < ApplicationController

  # GET /teams/new
  def new
    @team = Team.new #(parent_id: params[:parent_id])
  end

  # GET /teams/1/edit
  def edit
  end

  # POST /teams
  def create
    @team = Team.new(team_params)

    respond_to do |format|
      if @team.save
        format.html { redirect_to @team, success: t('.flash.success.message') }
      else
        format.html { render :new, danger: t('.flash.danger.message') }
      end
    end
  end

  # GET /teams/1/search_team_user
  def search_team_user
    @users = User.order(:first_name).where("first_name like ?", "%#{params[:term]}%")
    render json: @users.map { |u| { value: u.id, label: u.name } }
  end

  # GET /teams/1/new_team_user
  def new_team_user
    @team = Team.find(params[:id])
    @new_team_user = @team.team_users.build(user_id: params[:user_id])
  end

  private

    # Never trust parameters from the scary internet, only allow the white list through.
    def team_params
      params.require(:team).permit(
        :name,
        :parent_id,
        team_users_attributes: [:_destroy, :id, :user_id]
      )
    end
end
resources :teams do
  get :search_team_user, on: :member
  get :new_team_user, on: :member
end
<%= form_for(@team) do |f| %>
  <div class='row'>
    <div class='<%= column_class %>'>
      <div class='form-group row'>
        <div class='<%= dynamic_small_column_class %>'>
          Team membership
        </div>
        <div class='<%= dynamic_large_column_class %>'>
          <div id='team-user-select' class='new-nested-group mb-3'>
            <%= text_field_tag 'search_team_users', nil, class: 'form-control autocomplete autocomplete-search new-nested-object', data: { autocomplete_object_id: true, autocomplete_source: search_team_user_team_path(@team), new_nested_object_path: new_team_user_team_path(@team) } %>
            <%= hidden_field_tag 'user_id', nil, class: 'autocomplete autocomplete-value new-nested-object' %>
          </div>
          <div id='team-users' class='nested-objects'>
            <%= render 'team_user_fields', f: f, team_users: @team_users, child_index: nil %>
          </div>
        </div>
      </div><!-- /.form-group.row -->
    </div><!-- /.col -->
  </div><!-- /.row -->
  <hr class='my-5'>
  <div class='row'>
    <div class='<%= column_class %>'>
      <div class='pull-right'>
        <%= cancel_link %>
        <%= save_link %>
      </div>
    </div><!-- /.col -->
  </div><!-- /.row -->
<% end %>
$('#team-users').append("<%= j(fields_for(@team) { |f| render('team_user_fields', f: f, team_users: @new_team_user, child_index: Time.now.to_i) }) %>");
app/views/teams/_-form.html.erb

class TeamsController < ApplicationController

  # GET /teams/new
  def new
    @team = Team.new #(parent_id: params[:parent_id])
  end

  # GET /teams/1/edit
  def edit
  end

  # POST /teams
  def create
    @team = Team.new(team_params)

    respond_to do |format|
      if @team.save
        format.html { redirect_to @team, success: t('.flash.success.message') }
      else
        format.html { render :new, danger: t('.flash.danger.message') }
      end
    end
  end

  # GET /teams/1/search_team_user
  def search_team_user
    @users = User.order(:first_name).where("first_name like ?", "%#{params[:term]}%")
    render json: @users.map { |u| { value: u.id, label: u.name } }
  end

  # GET /teams/1/new_team_user
  def new_team_user
    @team = Team.find(params[:id])
    @new_team_user = @team.team_users.build(user_id: params[:user_id])
  end

  private

    # Never trust parameters from the scary internet, only allow the white list through.
    def team_params
      params.require(:team).permit(
        :name,
        :parent_id,
        team_users_attributes: [:_destroy, :id, :user_id]
      )
    end
end
resources :teams do
  get :search_team_user, on: :member
  get :new_team_user, on: :member
end
<%= form_for(@team) do |f| %>
  <div class='row'>
    <div class='<%= column_class %>'>
      <div class='form-group row'>
        <div class='<%= dynamic_small_column_class %>'>
          Team membership
        </div>
        <div class='<%= dynamic_large_column_class %>'>
          <div id='team-user-select' class='new-nested-group mb-3'>
            <%= text_field_tag 'search_team_users', nil, class: 'form-control autocomplete autocomplete-search new-nested-object', data: { autocomplete_object_id: true, autocomplete_source: search_team_user_team_path(@team), new_nested_object_path: new_team_user_team_path(@team) } %>
            <%= hidden_field_tag 'user_id', nil, class: 'autocomplete autocomplete-value new-nested-object' %>
          </div>
          <div id='team-users' class='nested-objects'>
            <%= render 'team_user_fields', f: f, team_users: @team_users, child_index: nil %>
          </div>
        </div>
      </div><!-- /.form-group.row -->
    </div><!-- /.col -->
  </div><!-- /.row -->
  <hr class='my-5'>
  <div class='row'>
    <div class='<%= column_class %>'>
      <div class='pull-right'>
        <%= cancel_link %>
        <%= save_link %>
      </div>
    </div><!-- /.col -->
  </div><!-- /.row -->
<% end %>
$('#team-users').append("<%= j(fields_for(@team) { |f| render('team_user_fields', f: f, team_users: @new_team_user, child_index: Time.now.to_i) }) %>");
此代码在转换到团队新页面时生成此错误:

显示 /Users/nikolaylipovtsev/Documents/Projects/inbox\u task/app/views/teams/\u form.html.erb 第23行的位置:

没有路由匹配{:action=>“search\u team\u user”,:controller=>“teams”, :id=>#,:locale=>:ru}缺少必需的 密钥:[:id]


需要更改什么?

以下路线意味着需要一个具有有效
id
的团队

get :search_team_user, on: :member
在新团队页面中,
@team
是使用
@team=team.new
创建的,因此其
id
属性为nil。这正是错误所说的

没有路由匹配{:action=>“search\u team\u user”,:controller=>“teams”,:id=>,:locale=>:ru}缺少必需的键:[:id]

teamscoontroller#search_team_user
中,我可以看到此操作不需要团队来正确运行。因此,要解决此问题,您可以将路线更改为

resources :teams do
  get :search_team_user, on: :collection
  get :new_team_user, on: :member
end

是的,但是团队[:id]需要团队控制器#新的团队用户。这是正确保存关联的必要条件。@NikolayLipovtsev查看路由,
new\u team\u user
仍在成员上。而此路径
new\u team\u user
位于新视图中,如果业务逻辑规定新用户必须与团队关联,则将引发错误
@NikolayLipovtsev。在团队“创建”表单中显示创建新用户的链接是没有意义的,因为没有团队可以将新用户与之关联。编辑团队时只显示该链接不是更有意义吗?