創建邏輯我有三個模型,Artwork
,ArtworkTag
,和Tag
,其中ArtworkTag
表示M:N Artwork
和Tag
之間的關係。 Tag
只存儲標籤名稱,即:tag
。在一個控制器訪問兩個模型
當從ArtworkTagsController
創建標籤,有必要先看看是否存在於tags
表:tag
,如果不創建它,然後使用標籤id
使在ArtworkTag
的關係。
下面你可以看到我直接從這個控制器調用Tag
,我認爲這不是正確的做法。
我應該如何處理這種情況與適當的分離關注?
def create
tag = params[:artwork_tag][:tag].downcase
@tag = Tag.find_by_tag(tag)
if @tag.blank?
@tag = Tag.new(:tag => tag)
@tag.save
end
artwork_id = params[:artwork_tag][:artwork_id]
user_id = params[:artwork_tag][:user_id]
artwork_tag = {
"tag_id" => @tag.id,
"artwork_id" => artwork_id,
"user_id" => user_id
}
@artwork_tag = ArtworkTag.new(:tag_id => @tag.id, :artwork_id => artwork_id, :user_id => user_id)
@artwork_tag.save
respond_to do |format|
format.json { render :json => {
"id" => @artwork_tag.id, "tag" => @tag.tag, "artwork_id" => artwork_id },
:status => :created }
end
end
當然我沒有辦法測試,但這應該在功能上與您在問題中所具有的功能相同。 –
這工作正常,雖然當我添加CanCan的'load_and_authorize_resource'在控制器的頂部,我得到'ActiveModel :: MassAssignmentSecurity :: Error(不能mass-assign protected attributes:tag):'。有任何想法嗎? –
是的。在'app/models/artwork_tag.rb'中,將'attr_accessible:tag'添加到模型的頂部,類似於第二行,緊跟在類定義之後。您可能需要閱讀一些有關批量分配的內容,因爲這可能不是唯一需要'attr_accessible'才能使其工作的地方。 –