0

我有两个模型

具有 has_and_belongs_to_many 的项目:用户

拥有 has_and_belongs_to_many 的用户:projects

在项目视图中,我有一个带有选择器的表单,我想在其中尝试将多个用户分配给一个项目。

<%= select_tag("project[users]",  options_for_select(@users, @project_users), {:multiple=>true, :size=>6} )%>

在我的项目控制器中,选择中使用的变量是

@project_users = @project.users.collect { |user| user.id}
@users = User.all.collect { |user| ["#{user.first_name} #{user.last_name}", user.id] }

全力以赴

<select id="project_users" multiple="multiple" name="project[users][]" size="6">
   <option value="#<User:0x007f567cb7f078>">User1</option>
   <option value="#<User:0x007f567cb7e9c0>">User2</option>
</select>

问题是这不等同于

@some_project << [User(#), User(#)]

("注意 User(#) 代表类实例")

相反,它相当于

@some_project << ["1", "2"]

问题是用户实例被转换为字符串,但没有再次返回到实例中。

哪个不起作用,并且会引发错误

ActiveRecord::AssociationTypeMismatch in ProjectsController#update
User(#70004716784160) expected, got String(#4266680)

我怎样才能使它正常工作?

4

2 回答 2

4

在您的用户模型中:

def full_name
  [first_name, last_name].join(" ")
end

在您的控制器中

@users = User.all

在您看来:

<%= select_tag('project[user_ids]', options_from_collection_for_select(@users, 'id', 'full_name'), { :multiple => true, :size => 6 }) %>

然后你可以使用

@project.user_ids = params[:project][:user_ids]

或者

@project.update_attributes(params[:project])

用于分配。

于 2012-05-24T20:05:53.093 回答
2

您无法发送实例。它可以在表单的呈现和提交之间改变。转换为字符串是一种单向操作,因为它指的是对象的唯一 ID(如内存地址),而不是属性或数据库标识符!因为它不是 ActiveRecord 的一部分,而是 ruby​​ 的对象库。当表单的数据返回时,实例不在内存中,因此您无法将其转换回来,即使其他方式可能也是如此。

坚持简单的旧方式:

@project_users = @project.users.collect { |user| user.id}
@users = User.all.collect { |user| ["#{user.first_name} #{user.last_name}", user.id] }

并且在提交数据时:

@users = params[:project][:users].map{|a| User.find(a) }
于 2012-05-24T19:46:46.223 回答