ruby-on-rails – 如何使用继承和嵌套属性构建Rails表单?
我有一个调查应用程序,基本上沿着
Railscast 196行,但有一个障碍:Railscast有一个Question类,其中has_many:答案,我有几个:
Question (self.abstract_class = true) BasicQuestion < Question MultipleChoiceQuestion < Question 为了完成这项工作,我不得不覆盖Survey中的问题getter,这看起来有点像kludge但不是太糟糕(有没有标准的方法来做到这一点?): Survey.rb has_many :questions accepts_nested_attributes_for :questions def questions # simplified a bit for brevity questions = [] [BasicQuestion,LikertQuestion,MultipleChoiceQuestion].each do |model| questions += model.where(:survey_id => self.id) end questions end Survey_Controller.rb def survey_params params.require(:survey).permit(:name,:questions_attributes => [:id,:name]) end 到现在为止还挺好.问题是这样的: 再次来自Railscast,我在survey / edit.html.erb中有这个: surveys/edit.html.erb <%= f.fields_for :questions do |builder| %> <%= render 'edit_question_fields',f: builder %> <% end %> 但是,这会返回以下形式的哈希: { "survey" => { "name" => "Howard",questions_attributes => { "id" => "1","name" => "Vince" }}} Rails给我一个错误:ActiveRecord :: StatementInvalid(找不到表”) – 那么,我该如何解决呢?在不完全放弃nested_attributes或继承的情况下,我可以想到四种方式: >切换到STI(而不是问题是抽象类),在params散列中包含_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" => { "name" => "Howard","basic_question" => { "id" => "1","name" => "Vince" },"multiple_choice_question" => { "id" => "1","name" => "Naboo" }}} 我需要索引的问题,例如“basic_questions_attributes”而不是“basic_question” – 任何人都知道如何做到这一点? 显然,主要关注的是能够以最少的麻烦在以后放入新的问题子类(或改变现有的子类的行为). 目前我倾向于使用选项#3,因为它看起来最简单,最优雅,但是,我不确定我是不是错过了一些更好的方法来做到这一点. (或以某种方式搞砸了问题子类化实现.)有没有人有更好的想法或更多的Rails类似的方式让这个工作?! 解决方法
看一下使用表单对象来封装逻辑和创建问题?
http://railscasts.com/episodes/416-form-objects
我还会考虑使用STI,以便您的Survey.rb不需要重新定义问题 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |