2012-11-13 77 views
0

創建邏輯我有三個模型,ArtworkArtworkTag,和Tag,其中ArtworkTag表示M:N ArtworkTag之間的關係。 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 

回答

1

我會做這樣的事情:

def create 
    artwork_tag = ArtworkTag.create(
    :tag => Tag.find_or_create_by_tag(params[:artwork_tag][:tag].downcase), 
    :artwork_id => params[:artwork_tag][:artwork_id], 
    :user_id => params[:artwork_tag][:user_id] 
) 

    respond_to do |format| 
    format.json { render :json => { :artwork_tag => artwork_tag } } 
    end 
end 
+0

當然我沒有辦法測試,但這應該在功能上與您在問題中所具有的功能相同。 –

+0

這工作正常,雖然當我添加CanCan的'load_and_authorize_resource'在控制器的頂部,我得到'ActiveModel :: MassAssignmentSecurity :: Error(不能mass-assign protected attributes:tag):'。有任何想法嗎? –

+0

是的。在'app/models/artwork_tag.rb'中,將'attr_accessible:tag'添加到模型的頂部,類似於第二行,緊跟在類定義之後。您可能需要閱讀一些有關批量分配的內容,因爲這可能不是唯一需要'attr_accessible'才能使其工作的地方。 –

0

我不知道我理解你的問題,但你可以用first_or_create方法檢查記錄已經存在與否,如果沒有也將創造新的紀錄。只有一行

@tag = Tag.find_by_tag(tag) 

if @tag.blank? 
    @tag = Tag.new(:tag => tag) 
    @tag.save 
end 

:您可以將這個(我不是使用實例變量,因爲我認爲你不需要用它看來,如果你只需要將其更改爲@tag和PARAMS到tag_id: @tag.id

tag = Tag.where(tag: tag).first_or_create() 

我看你定義artwork_tag,但爲什麼你不使用它呢?我想你可以替換:

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 

與此代碼:

params = { artwork_tag: { 
          tag_id: tag.id, 
          artwork_id: artwork_id, 
          user_id: user_id } } 
@artwork_tag = ArtworkTag.create(params[:artwork_tag]) 
相關問題