0

私は2つのモデルを持っています

has_and_belongs_to_many :users を持つプロジェクト

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 に答える