2

ここで提供されたヘルプに事前に感謝します。実際、レール開発とスタックオーバーフローは初めてです。多対多の関係を作成していて、いくつかの基本に問題があります。ユーザーとグループの関係を作りたいと思っています。

モデル:

    class User < ActiveRecord::Base
      attr_accessible :name
      has_and_belongs_to_many :groups
    end

    class Group < ActiveRecord::Base
      attr_accessible :name
      has_and_belongs_to_many :users
    end

デシベル/移行 create_groups_users_join

class CreateGroupsUsersJoin < ActiveRecord::Migration
  def self.up
    create_table 'groups_users', :id => false do |t|
      t.column 'group_id', :integer
      t.column 'user_id', :integer
     end
   end
 def self.down
   drop_table 'groups_users'
 end
end

このコードを使用して、ユーザー フォームにドロップダウンを作成しました。

真 }) %>

コントローラー

def edit
  @user = User.find(params[:id])
  @groups = Group.all
  ...
end
  def new
  @user = User.new
  @groups = Group.all
  ...
end

作成/編集/更新時に結合テーブルを更新するためにコントローラーに何を追加するかについて、私は今迷っています。これを実現するために何を変更する必要があるかを誰かが説明できますか? ありがとうございました。

これが私が今得ているエラー出力です:

 {"utf8"=>"✓",
    "authenticity_token"=>"pgyajCT23qQVMuS+MQgG6E7M7Q8AWjfGaYbe3q7QDSA=",
    "group"=>{"group_id"=>"1"},
    "user"=>{"name"=>"ymudfg"},
    "commit"=>"Create User"}
4

3 に答える 3

3

コントローラーでこれを行うことで、ユーザーをグループに追加できます。

   user = User.find(params[:uid])
   group = Group.find(params[:gid])

   group.users <<  user  #Adding user to group

グループをユーザーに割り当てる場合:

   user.groups << group

編集:あなたのコメントによると

  class UsersController < ApplicationController
    def new
      @user = User.new
      @group = Group.all
    end

    def create
      @user = User.new(params[:user])
      @group = Group.find(params[:group][:group_id]) # As per log
      if @user.save
        @group.users << @user
      else
        render :new
      end
    end

    #Similarly you can implement edit
  end
于 2013-01-11T14:12:18.300 に答える
0

ユーザーとグループ間の関連付けは、レールによって自動的に処理されます。これが、追加した理由ですhas_and_belongs_to_many

ユーザーをグループに追加する場合は、次のようにします。

@group.users.create(params[:user])

あなたができる反対側:

@user.groups.create(params[:group])

あなたができるユーザーのグループを見つけるには:

@user.groups.find(params[:id])

于 2013-01-11T14:14:45.500 に答える