Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过多态关联创建对象_Ruby On Rails_Ruby_Polymorphic Associations - Fatal编程技术网

Ruby on rails 通过多态关联创建对象

Ruby on rails 通过多态关联创建对象,ruby-on-rails,ruby,polymorphic-associations,Ruby On Rails,Ruby,Polymorphic Associations,我需要(或者我认为)在我的模型中实现多态关联,但我出了点问题。让我们看看我的情况,这是一个简单的问答系统,逻辑如下: -一个问题可以由N个答案来回答。 -答案只能是一个“文本”异或(一个或另一个,而不是两个)一个“图片” 迁移: class CreateAnswers < ActiveRecord::Migration def change create_table :answers do |t| t.integer :question_id

我需要(或者我认为)在我的模型中实现多态关联,但我出了点问题。让我们看看我的情况,这是一个简单的问答系统,逻辑如下: -一个问题可以由N个答案来回答。 -答案只能是一个“文本”异或(一个或另一个,而不是两个)一个“图片”

迁移:

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
...
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>
...
和视图表单(仅具有这些字段):

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
...
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>
...
。。。

真})%%>
...
所以,问题是当我提交表单时,我会出现以下错误:

nil:NilClass的未定义方法
new'
app/controllers/answers\u controller.rb:52:in
create'


答案:)

有一个关系时,您必须使用:

@answerable.build_answer

而不是

@answerable.answer.new

请参阅以获取更多信息。

Hmm不确定它是否相关,但我会使用
attr\u accessible:answerable\u type,:answerable\u id
create方法中create\u answerable后@answerable.answer.class返回什么?@awenkh create\u answerable根据at参数type(“text”)创建继承类(AnswerText或AnswerPicture)的实例,或“图片”)。尝试将
create\u answerable(post[:answerable\u type],post[:answerable])
更改为
@answerable=create\u answerable(post[:answerable\u type],post[:answerable])
谢谢,你说得对。如果答案可能已经存在,我必须使用@answerable.create_-answer。并尝试(@answerable.answer | |@answerable.create_-answer)
@answerable.answer.new