如何使用has_and_belongs_to_many获取数组值?

时间:2016-02-02 05:26:35

标签: ruby-on-rails ruby ruby-on-rails-4

无法保存在选择框中选择的参数。

用户

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):

2 个答案:

答案 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)。