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。在团队“创建”表单中显示创建新用户的链接是没有意义的,因为没有团队可以将新用户与之关联。编辑团队时只显示该链接不是更有意义吗?