10

モデルにポリモーフィックアソシエーションを実装する必要があります(または実装すると思います)が、何か問題があります。私の状況を見てみましょう。これは単純な質問/回答システムであり、論理は次のとおりです。-質問はN個の回答で回答できます。-答えは、「テキスト」XOR(両方ではなく一方または他方)「画像」のみにすることができます。

移行:

class CreateAnswers < ActiveRecord::Migration
    def change
        create_table :answers do |t|
            t.integer :question_id
            t.references :answerable, :polymorphic => true
            t.timestamps
        end
    end
end

class CreateAnswerTexts < ActiveRecord::Migration
    def change
        create_table :answer_texts do |t|
            t.text :content

            t.timestamps
        end
    end
end

class CreateAnswerPictures < ActiveRecord::Migration
    def change
        create_table :answer_pictures do |t|
            t.string :content

            t.timestamps
        end
    end
end

モデル * answer.rb *

class Answer < ActiveRecord::Base
    belongs_to :user_id
    belongs_to :question_id
    belongs_to :answerable, :polymorphic => true

    attr_accessible :answerable_type
end

answer_text.rb

class AnswerText < ActiveRecord::Base
    TYPE = "text"

    has_one :answer, :as => :answerable

    attr_accessible :content
end

answer_picture.rb

class AnswerPicture < ActiveRecord::Base
    TYPE = "picture"

    has_one :answer, :as => :answerable

    attr_accessible :content
end

コントローラーanswers_controller.rb:

...
def create
    post = params[:answer]
    create_answerable(post[:answerable_type], post[:answerable])
    @answer = @answerable.answer.new()
end

private
def create_answerable(type, content)
    @answerable = ('Answer' + type.capitalize).classify.constantize.new(:content => content)
    @answerable.save
end
...

そして、フォームを表示します(これらのフィールドのみがあります):

...
<div class="field">
<%= f.label :answerable_type %><br />
<%= select("answer", "answerable_type", Answer::Types, {:include_blank => true}) %>
</div>
<div class="field">
<%= f.label :answerable %><br />
<%= f.text_field :answerable %>
</div>
...

したがって、問題は、フォームを送信すると次のエラーが発生することです。

未定義のメソッドnew' for nil:NilClass app/controllers/answers_controller.rb:52:in作成'

答え?:)

4

1 に答える 1

23

関係ではhas_one、次を使用する必要があります。

@answerable.build_answer

また

@answerable.create_answer

それ以外の

@answerable.answer.new

詳細については、リファレンスを参照してください。

于 2012-11-13T11:51:33.690 に答える