2013-10-01 63 views
1

所以我爲我的Questions模型創建了一個Category模型。我也爲多態關係創建了一個Tag模型,這樣一個問題就可以有很多類別,而一個類別可以有很多問題。Rails多對多多態創建多項式

我無法完成創建問題並選擇類別時與該問題關聯的類別也被保存的過程。提交表單和創建標籤似乎存在缺失的聯繫。

這裏是我的模型:

question.rb

class Question < ActiveRecord::Base 

has_many :tags, :as => :taggable, :dependent => :destroy 
has_many :categories, :through => :tags 

end 

tag.rb

class Tag < ActiveRecord::Base 

    belongs_to :taggable, :polymorphic => true 
    belongs_to :category 

end 

Category.rb

class Category < ActiveRecord::Base 

has_many :tags, :dependent => :destroy 
has_many :questions, :through => :tags, :source => :taggable, :source_type => 'Question' 

end 

提問形式:

<%= f.input :question, input_html: { class: 'form-control' }%> 
</div> 

<div class="form-group"> 
<%= f.input :category_ids, collection: Category.all, :input_html => {multiple: true, class: 'form-control' } %> 
</div> 

<%= f.fields_for :choices do |b| %> 
<div class="form-group"> 
<%= b.input :choice, input_html: { class: 'form-control' } %> 

</div> 

<% end %> 

<%= f.button :submit, :class => "btn btn-primary"%> 

問題控制器創建行動

DEF創建 @question = current_user.questions.new(question_params)

respond_to do |format| 
    if @question.save 
    format.html { redirect_to @question, notice: 'Question was successfully created.' } 
    format.json { render action: 'show', status: :created, location: @question } 
    else 
    format.html { render action: 'new' } 
    format.json { render json: @question.errors, status: :unprocessable_entity } 
    end 
end end 

當提交表單時,類別ID提交像這樣: 「category_ids」=> [ 「」, 「2」, 「3」]

我覺得缺少的環節是創建像這樣

def create_tag (category_id, question_id) 
    t = Tag.new 
    t.taggable = Question.find(question_id) 
    t.category = Category.find(category_id) 
    t.save 

end 

的方法,但我不能確定在哪裏最好的地方,這或如何將其連接在創建行動,併成功CRE吃適當的協會。

此外這種方法只會創建1個類別,所以我需要遍歷類別ID來創建多個。

謝謝

回答

0

你可以試試這個代碼嗎?

def create 
    @question = current_user.questions.new(question_params) 
    if @question.save 
    params[:question][:category_ids].select{ |x| x.present? }.each do |category_id| 
     tag = Tag.new(taggable: @question, category_id: category_id) 
     if tag.save 
     else 
     something_went_wrong = tag 
     end 
    end 
    else 
    something_went_wrong = @question 
    end 
    respond_to do |format| 
    if something_went_wrong.blank? 
     format.html { redirect_to @question, notice: 'Question was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @question } 
    else 
     format.html { render action: 'new' } 
     format.json { render json: something_went_wrong.errors, status: :unprocessable_entity } 
    end 
    end 
end 

這段代碼的事情是:

  • 創建的每個標籤只是問題&類別之間的聯繫,對標籤沒有實際的名稱。
  • 即使一個標籤沒有通過驗證(如唯一性約束),其他有效標籤也會被創建,但仍會顯示錯誤。您可能想要在創建它們之前檢查所有標籤是否有效。
+0

謝謝MrYoshiji。由於某種原因,表單在數組的開始處提交了一個無「category_id」「。在代碼完全運行之前,我必須對此進行調查。 –

+0

這是一個Rails的正常行爲,就像雙生成的check_box字段具有相反的值:Rails添加了這個空字符串,以便讓您「填充」沒有值的選擇。如果你沒有選擇任何值,你仍然希望對象被更新,對吧?如果您取消選擇問題的所有類別,則應刪除關係。那麼如果你提交一個Select沒有選定值的值,那麼這個參數將被忽略:Rails在這個參數中保留一個空條目,允許你設置這個選擇框的值爲「none」。 – MrYoshiji

+0

謝謝。是的,如果沒有選擇類別值,我希望更新對象。不幸的是,當提交此代碼時,我收到錯誤'private method'select'nil:NilClass'。 –