加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何使用继承和嵌套属性构建Rails表单?

发布时间:2020-12-17 02:05:32 所属栏目:百科 来源:网络整理
导读:我有一个调查应用程序,基本上沿着 Railscast 196行,但有一个障碍:Railscast有一个Question类,其中has_many:答案,我有几个: Question (self.abstract_class = true)BasicQuestion QuestionMultipleChoiceQuestion Question 为了完成这项工作,我不得不覆盖S
我有一个调查应用程序,基本上沿着 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分别处理每个问题类型:

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” – 任何人都知道如何做到这一点?
>覆盖Survey.rb中的questions_attributes =以对其进行排序.
>创建一个新的QuestionsFormBuilder对象来处理所有内容,沿着“Rails nested attributes form for polymorphic/single table inheritance associations”.

显然,主要关注的是能够以最少的麻烦在以后放入新的问题子类(或改变现有的子类的行为).

目前我倾向于使用选项#3,因为它看起来最简单,最优雅,但是,我不确定我是不是错过了一些更好的方法来做到这一点. (或以某种方式搞砸了问题子类化实现.)有没有人有更好的想法或更多的Rails类似的方式让这个工作?!

解决方法

看一下使用表单对象来封装逻辑和创建问题? http://railscasts.com/episodes/416-form-objects

我还会考虑使用STI,以便您的Survey.rb不需要重新定义问题

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读