1

そこで、質問モデルのカテゴリ モデルを作成しました。また、ポリモーフィック リレーションシップのタグ モデルを作成したので、1 つの質問に多くのカテゴリを含めることができ、1 つのカテゴリに複数の質問を含めることができます。

質問を作成してカテゴリを選択すると、その質問に関連付けられたカテゴリも保存されるプロセスを完了できません。フォームの送信とタグの作成の間に接続が失われているようです。

ここに私のモデルがあります:

question.rb

class Question < ActiveRecord::Base

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

end

タグ.rb

class Tag < ActiveRecord::Base

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

end

カテゴリー.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 create @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

しかし、これをどこに配置するのが最適なのか、作成アクションで接続して適切な関連付けを正常に作成する方法がわかりません。

また、このメソッドは 1 つのカテゴリしか作成しないため、カテゴリ ID をループして複数作成する必要があります。

ありがとう

4

1 に答える 1

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

このコードの内容は次のとおりです。

  • 作成された各タグは、質問とカテゴリの間の単なるリンクであり、タグの実際の名前はありません。
  • 1 つのタグが検証 (一意性制約など) に合格しない場合でも、他の有効なタグが作成されますが、エラーが表示されます。タグを作成する前に、すべてのタグが有効かどうかを確認することをお勧めします。
于 2013-10-01T14:02:28.150 に答える