Ruby on rails 通过多态关联创建对象
我需要(或者我认为)在我的模型中实现多态关联,但我出了点问题。让我们看看我的情况,这是一个简单的问答系统,逻辑如下: -一个问题可以由N个答案来回答。 -答案只能是一个“文本”异或(一个或另一个,而不是两个)一个“图片” 迁移: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
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