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來創建多個。
謝謝
謝謝MrYoshiji。由於某種原因,表單在數組的開始處提交了一個無「category_id」「。在代碼完全運行之前,我必須對此進行調查。 –
這是一個Rails的正常行爲,就像雙生成的check_box字段具有相反的值:Rails添加了這個空字符串,以便讓您「填充」沒有值的選擇。如果你沒有選擇任何值,你仍然希望對象被更新,對吧?如果您取消選擇問題的所有類別,則應刪除關係。那麼如果你提交一個Select沒有選定值的值,那麼這個參數將被忽略:Rails在這個參數中保留一個空條目,允許你設置這個選擇框的值爲「none」。 – MrYoshiji
謝謝。是的,如果沒有選擇類別值,我希望更新對象。不幸的是,當提交此代碼時,我收到錯誤'private method'select'nil:NilClass'。 –