无法保存在选择框中选择的参数。
表用户:
1id| |name|
1 CR7
2 Messi
表 ejecutives :
1id| |name|
1 Mourinho
2 Guardiola
表 user_ejecutives :
|id| |user_id| |ejecutive_id|
1 1 1
2 2 2
控制器 users_controller.rb :
def new
@obj_user = User.new
end
def create
@user = User.new user_params
@user.save
end
def show
@user = User.find(params[:id])
end
private
def user_params
params.require(:user).permit(:name, user_ejecutive_ids: [])
end
型号:
#User.rb
has_many :ejecutives, :through => :user_ejecutives
has_many :user_ejecutives
has_and_belongs_to_many :user_ejecutives, class_name: "User", join_table: "user_ejecutives"#, foreign_key: :user_id, association_foreign_key: :ejecutive_id
#Ejecutive.rb
has_many :user_ejecutives
has_many :users, :through => :user_ejecutives
#UserEjecutive.rb
belongs_to :user
belongs_to :ejecutive
查看 new.html.erb :
<%= form_for @user do |f| %>
<%= form.text_field :name %>
<%= f.collection_select :user_ejecutive_ids, Ejecutive.all, :id, :name, multiple: true %>
<% end %>
查看 show.html.erb
<% @user.ejecutives.each do |ejecutive| %>
<%= ejecutive.name %></label>
<% end %>
我没有在视图节目中获得结果,它显示在日志中:
SystemStackError (stack level too deep):
答案 0 :(得分:1)
请尝试以下代码。
params.require(:user).permit(:name,:user_ejecutives =&gt; [])
嘿,我认为你将“ejecutive_id”列声明为整数但是当循环通过“user_ejecutives”时你得到的每个值都是字符串,可能是这导致了问题,请将你的创建动作更新到下面。
def create
obj_user = User.new(user_params)
if obj_user.save
params[:user_ejecutives].each do |ejecutive|
user_ejecutive = UserEjecutive.create(user_id: obj_user.id, ejecutive_id: ejecutive.to_i)
user_ejecutive.save
end
end
end
答案 1 :(得分:1)
如果您只是尝试填充联接表(user_ejecutives
),则您需要填充singular_colletion_ids
方法:
#app/controllers/users_controller.rb
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new user_params
@user.save
end
private
def user_params
params.require(:user).permit(:name, user_ejecutive_ids: [])
end
end
#app/views/users/new.html.erb
<%= form_for @user do |f| %>
<%= f.collection_select :user_ejecutive_ids, User.all, :id, :name, multiple: true %>
<%= f.submit %>
<% end %>
这会为您创建的每个新user_ejecutives
分配新的@user
。
PS User.all
在此实例中有效,因为您正在处理新的(未创建的)@user
记录,因此它不会出现在数据库中。
如果您想为每个新的user_ejecutives
创建新的@user
,那么您将要使用accepts_nested_attributes_for
,如果需要我可以解释
<强>更新强>
所以你的错误如下:
Unpermitted parameter: user_ejecutive_ids
...你还有另一个错误......
NoMethodError (undefined method `each' for nil:NilClass):
这正是我不喜欢你的代码的原因。因为它不符合惯例,所以你去评估是否存在params等。
您需要使用我发布的控制器代码 - 它会为您填充另一个表格,并修复此NilClass
错误。
-
加入表格
您的user_ejecutives
表格是加入表格。
您的User
模型应具有以下内容:
#app/models/user.rb
class User < ActiveRecord::Base
has_and_belongs_to_many :user_ejecutives, class_name: "User", join_table: "user_ejecutives", foreign_key: :user_id, association_foreign_key: :ejecutive_id
end
您必须从id
表中删除user_ejecutives
列(根据定义here)。这样做的重要性在于,根据我推荐的代码,它使您能够填充singular_collection_ids
方法(在您的情况下为user_ejective_ids
)。