2016-12-06 27 views
1

這裏再次談到rails的新手。更新加入模型的額外屬性的標準方法 - Rails

其實我在這問了一個類似的問題:Having trouble in updating join model extra attributes in has_many through association - Rails,但是以爲我問了一個錯誤的方向和複雜的方式,所以想打開一個新的問題,以更簡單更精確的方式提問。

想知道何時在has_many through:的加入模型中有一個額外的屬性保存和更新加入模型的額外屬性的標準方式是什麼。以下只是一個例子,我曾試過:

Forum,A User有很多Group; A Group有許多User,通過GroupUser

class User < ApplicationRecord 
    has_many :group_users 
    has_many :groups, through: :group_users 
end 

class Group < ApplicationRecord 
    belongs_to :forum 

    has_many :group_users 
    has_many :users, through: :group_users 
end 

class GroupUser < ApplicationRecord 
    belongs_to :group 
    belongs_to :user 
end 

class Forum < ApplicationRecord 
    has_many :groups 
end 

由於一些原因,我可能需要一個額外的屬性forum_id添加到加盟模式GroupUser所以它變得像:

UML diagram

什麼是做create的正確方法和update在控制器?

我已經試過類似:

def create 
    @forum = Forum.find(params[:forum_id]) 
    @group = @forum.groups.build(group_params) 
    @group.group_users.each do |join| 
     join.forum_id = @group.forum_id 
    end 
    @group.save 
end 

def update 
    @group = Group.find(params[:id]) 
    @group.group_users.each do |join| 
     join.forum_id = @group.forum_id 
    end 
    @group.update(group_params) 
end 

private 
def group_params 
    params.require(:group).permit(:name, user_ids: []) 
end 

我可以保存forum_idcreate;但是,在關聯中執行update時,forum_id將爲零。它已經爲我連接了超過20個小時,我真的想知道標準的方式來保存和更新加入模型的額外屬性。

感謝您閱讀我的話。欣賞任何評論。現在每一個建議都會緩解我的頭痛。謝謝。


更新上午10:17 +8 12月7日

我曾嘗試accepted_nested_attributes_for的解決方案,沒有運氣,我還是可以插入saveforum_id,但在update仍然不插入forum_id,該更新將得到forum_id: nil

變化的記錄如下:

型號:

class Group < ApplicationRecord 
    belongs_to :forum 

    has_many :group_users, inverse_of: :group 
    has_many :users, through: :group_users 

    accepts_nested_attributes_for :group_users 
end 

控制器:

def group_params 
    params.require(:group).permit(:name, user_ids: [], group_users_attributes: [:id, :forum_id]) 
end 

其實我已經創建了一個項目,你可以在這裏下載:https://github.com/kan1011/rails-101-demo(如果你想運行它,你需要創建在軌道c中的第一個論壇由f = Forum.newf.save


更新下午12時53 +8,2016年8月12日

已嘗試使用save而不是update(params),但它完全沒有更新,在提交更新表單後記錄將保持不變。

曾嘗試使用puts params.inspectputs group_params.inspect,並談到了以下工作:

PARAMS

Parameters: {"utf8"=>"✓", "authenticity_token"=>"s8l+wWzTci7hD1AoyLN9sIjFu296ooU0VwWgCFIP4yvJaR7I3HS9E3ja4VXcFQv1QadyeJspef3dBD1XzVaF+Q==", "group"=>{"name"=>"fff", "user_ids"=>["", "1", "2", "3"]}, "commit"=>"Submit", "id"=>"8"} 

「✓」, 「_method」=> 「放」, 「authenticity_token」= >「s8l + wWzTci7hD1AoyLN9sIjFu296ooU0VwWgCFIP4yvJaR7I3HS9E3ja4VXcFQv1QadyeJspef3dBD1XzVaF + Q ==」,「group」=> {「name」=>「fff」,「user_ids」=> [「」,「1」,「2」,「3」]},「提交「,」控制器「=>」組「,」動作「=>」更新「,」ID「=>」8「}允許:假>

group_params

<ActionController::Parameters {"name"=>"fff", "user_ids"=>["", "1", "2", "3"]} permitted: true> 

回答

0

我只是做一個猜測在這裏,但我認爲你必須對你的小組模型添加

accepts_nested_attributes_for :group_users 

。另外,相信你必須添加permited params到你的控制器。像這樣:

params.require(:group).permit(:name, user_ids: [], group_users_attributes: [:id, :attribute1, :attribute2, :_destroy]) 

這是怎麼回事。在這種情況下,僅當您使用繭寶石時才需要:_destroy屬性。替換你想要更新的屬性的屬性1,屬性2。在這種情況下,我相信這只是forum_id

希望這可以幫助你...

+0

感謝您的建議。已經試過並更新過這個問題,但沒有運氣...,我認爲臨界點可能是#save和#update(params)的區別。你有沒有想過這個?十分感謝。 –

+0

好吧,你有沒有嘗試過保存而不是更新? save命令也可用於更新... –

+0

另外,嘗試在更新操作上調試什麼來自group_params(logger.debug group_params.to_h)。我相信forum_id即將成爲零。另外,調試所有參數,如logger.debug params.to_unsafe_h(這樣它會顯示所有參數,忽略強參數),所以如果問題出現在傳遞給參數的參數上,或者值不是來自於形式... –

相關問題