Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/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 如何使用继承和嵌套属性构建Rails表单?_Ruby On Rails_Inheritance_Activerecord_Ruby On Rails 4_Nested Attributes - Fatal编程技术网

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

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.

我有一个调查应用程序,基本上是这样的,但有一个障碍:Railscast有一个
问题
类,
有很多答案,我有几个:

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" }}}