Ruby on rails 如何使用继承和嵌套属性构建Rails表单?
我有一个调查应用程序,基本上是这样的,但有一个障碍:Railscast有一个Ruby on rails 如何使用继承和嵌套属性构建Rails表单?,ruby-on-rails,inheritance,activerecord,ruby-on-rails-4,nested-attributes,Ruby On Rails,Inheritance,Activerecord,Ruby On Rails 4,Nested Attributes,我有一个调查应用程序,基本上是这样的,但有一个障碍:Railscast有一个问题类,有很多答案,我有几个: Question (self.abstract_class = true) BasicQuestion < Question MultipleChoiceQuestion < Question 到目前为止,一切顺利。问题是: 同样来自Railscast,我在surveys/edit.html.erb中有以下内容: surveys/edit.html.erb <%= f.
问题
类,有很多答案,我有几个:
Question (self.abstract_class = true)
BasicQuestion < Question
MultipleChoiceQuestion < Question
到目前为止,一切顺利。问题是:
同样来自Railscast,我在surveys/edit.html.erb
中有以下内容:
surveys/edit.html.erb
<%= f.fields_for :questions do |builder| %>
<%= render 'edit_question_fields', f: builder %>
<% end %>
Rails给了我一个错误:ActiveRecord::StatementInvalid(找不到表“”)
--
大概是因为没有问题
表(它是一个抽象类)
那么,我该如何修复它呢?在不完全放弃嵌套的_属性
或继承的情况下,我可以想到四种方法:
切换到STI(而不是作为抽象类的Question
),在params散列中包含\u type
字段,然后从那里开始
让调查
分别处理每种问题类型:
Survey.rb
has_many :basic_questions
accepts_nested_attributes_for :basic_questions
has_many :multiple_choice_questions
accepts_nested_attributes_for :multiple_choice_questions
def questions
# same as before, still comes in handy
end
surveys/edit.html.erb
<% @survey.questions.each do |question| %>
<%= f.fields_for question do |builder| %>
<%= render 'edit_question_fields', f: builder %>
<% end %>
<% end %>`
我需要将问题索引为,例如,“基本问题属性”
,而不是“基本问题”
——有人知道怎么做吗
覆盖Survey.rb中的questions\u attributes=
,将其全部排序
创建一个新的questionsforbmuilder
对象来处理所有事情,沿“”行
显然,一个主要的关注点是以后能够以最少的麻烦插入新的问题子类(或更改现有子类的行为)
目前我倾向于选择3,因为它看起来最简单、最优雅,但我不确定我是否错过了更好的方法。(或者以某种方式搞砸了问题
子类化实现。)有没有人有更好的想法或更多类似Rails的方法来实现这个功能 看看如何使用表单对象来封装问题的逻辑和创建
我也会考虑使用STI,这样你的Survey.rb就不需要重新定义问题了你能用行号和错误发生的位置来公布你得到的准确错误吗?这是在控制器中发生的吗?您尚未发布控制器代码。您好@Max,控制器中的第@survey.update_attributes(survey_params)
行出现ActiveRecord错误,其中survey_params
的定义如上所述。如果我只是省略了调查参数中的:questions\u attributes
(即参数require(:survey).permit(:name)
),那么我不会得到任何错误,但问题当然不会得到更新。
{ "survey" => { "name" => "Howard", questions_attributes => { "id" => "1", "name" => "Vince" }}}
Survey.rb
has_many :basic_questions
accepts_nested_attributes_for :basic_questions
has_many :multiple_choice_questions
accepts_nested_attributes_for :multiple_choice_questions
def questions
# same as before, still comes in handy
end
surveys/edit.html.erb
<% @survey.questions.each do |question| %>
<%= f.fields_for question do |builder| %>
<%= render 'edit_question_fields', f: builder %>
<% end %>
<% end %>`
{ "survey" => { "name" => "Howard", "basic_question" => { "id" => "1", "name" => "Vince" }, "multiple_choice_question" => { "id" => "1", "name" => "Naboo" }}}