2017-10-24 8 views
0

私は2つのモデルを持っています:ユーザーと役割。 1人のユーザーが多くの役割を持つことができます。Rails:新しい関連へのactiverecordの更新

と仮定user1がROLE1とrole2のを持っています。今私はuser1にrole2とrole3を持たせたいと思う。

class User < ActiveRecord::Base 

    has_and_belongs_to_many :roles 

class Role < ActiveRecord::Base 

    has_and_belongs_to_many :users 

これは私のコードである

user = User.find(1) 
newrole = Role.find(2) #get role3 

user.roles[0] = newrole 

user.roles[0].save # does not work 

user.save # does not work 

私の問題を解決するためのRuby on Railsでの正しい方法は何ですか?

+0

'user.roles.new =" newrole "と' user.roles.save' – Gabbar

+0

新しいロールを追加しない、role1 - > role3を更新したい –

+0

ロールモデルのロールのカラム名は何ですか?これはOPの問題を解決し、なぜ私は、彼らが 'user.role_idsの=知られている場合、それははるかに簡単IDSで動作するように見つける – Gabbar

答えて

4

よりもむしろrole1からrole3にレコードを更新し、簡単な方法は、role1のレコードを削除し、role2のための新しいを作成することです。 has_and_belongs_to_manyについては

は、あなたが必要となるすべてのidを渡しているとレールが自動的にそれを扱うでしょう。

例:Railsのコンソールの場合

-> @user = User.first 
-> puts @user.role_ids 
    # [1,2] 

-> @user.role_ids = [2, 3] 

これはrole1を削除し、role3

編集のための記録を作成することにより、ユーザに新しい役割を割り当てます。 html.erb(表示)

def update 
    respond_to do |format| 
    if @user.update(user_params) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { render :show, status: :ok, location: @user } 
    else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

private 

def user_params 
    params.require(:user).permit(:first_name, :last_name, role_ids: []) 
end 

あなたはrole2role3を選択:

あなたはUserのフォームを持っており、複数選択

<%= form_for(book) do |f| %> 
    <div class="field"> 
    <%= f.label :first_name %> 
    <%= f.text_field :first_name %> 
    </div> 

    <div class="field"> 
    <%= f.label :roles %> 
    <%= f.collection_select :role_ids, Role.all, :id, :name, {}, {:multiple => true} %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

users_controller.rb(コントローラ)rolesのドロップダウンを持っていると仮定しましょうしてフォームを送信し、Railsは単にrole1のレコードを削除することによってそれを処理し、role3

0のための別のものを作成します
1
user.roles.destroy(Role.find(1)) # assuming Role.find(1) == role1 
user.roles << Role.find(3) # assuming Role.find(3) == role3 
+0

あなたは手の込んだ必要があります – vu1p3n0x

関連する問題