在Formtastic(Rails)中编辑/创建嵌套资源

时间:2016-08-02 14:17:38

标签: ruby-on-rails forms ruby-on-rails-4

这个问题是关于Rails 4 / postgresql而且该应用程序是在Heroku上托管的。

我正在网站上制作测验功能,我想知道如何最好地实现表格(使用Formtastic),以尽可能简化。我有三种模式:

  • 测验(has_many:quiz_questions),例如"测试看你有多棒"
  • QuizQuestion(belongs_to:quiz,has_many:quiz_options)。例如" 1。这是你最喜欢的颜色")
  • QuizOption(belongs_to:quiz_question)。例如"蓝色"

我已经设置了这样的表格:

<%= semantic_form_for([:admin, @quiz], :url => admin_quiz_path(@quiz.id)) do |f| %>
  <%= render 'form' , :f => f %>
<% end %>

表单如下所示:

<%= f.inputs %>

<h3>Quiz questions</h3>
<%= f.semantic_fields_for :quiz_questions do |qq_f| %>
    <%= qq_f.inputs %>

    <h4>Quiz options</h4>
    <%= qq_f.semantic_fields_for :quiz_options do |qqo_f| %>
        <%= qqo_f.inputs %>
    <% end %>

<% end %>

<%= f.actions do %>
  <%= f.action :submit %>
  or go <%= link_to 'back', admin_quizzes_path %>
<% end %>
然而,似乎不是按照我想要的方式工作。我希望能够以这种形式看到QuizQuestion和QuizOptions的字段(有那些对象),但我不知道。

更重要的是,我希望能够以这种形式创建一个新的QuizQuestion和随后的QuizOption。它不一定是jQuery / ajax或者其他任何东西,但是我想从这个表单中做到这一切。

基本上,我希望我的工作流程如下:

  1. 创建测验并为其添加值。单击“创建”。
  2. 添加第一个QuizQuestion并将值添加到其中(例如&#34;名称标签&#34;)。单击“创建”。
  3. 添加与QuizQuestion第一名相关的QuizOption及其名称标签&#34;。单击创建。
  4. 重复QuizQuestion / QuizOption,直到测验完成。
  5. 我该怎么做?

1 个答案:

答案 0 :(得分:1)

对于您的工作流,您可能必须为嵌套资源添加accept_nested_attributes_for,这样在创建对象对象时,您实际上可以创建嵌套子项(只要它们满足所有验证)。这样:

change: function (e) {
        veh_TRANSPORTEUR = this.dataItem();
},

声明如下:

# A quiz :has_many :quiz_questions
@quiz = Quiz.create(...)

在您的has_many :quiz_questions accepts_nested_attributes_for :quiz_questions 模型中,您实际上可以从测验模型中创建QuizQuestion,如:

Quiz

对深度嵌套的关联执行相同操作也会产生相同的效果。

也许您没有在表单上看到任何字段的原因是因为没有创建嵌套对象。让我解释。当您创建一个新的测验对象时,在# using the previously quiz model quiz.quiz_questions.create(...) (或测验的任何变形是......)中,您需要:

quizs_controller

def new
  quiz = Quiz.new()
end

如果您真的希望能够看到表单中的字段,那么您必须使用build方法并实际使用相应的嵌套资源填充该新对象。

请注意,为了使用表单,您必须在def create Quiz.new(quiz_params) end private def quiz_params # whitelisted parameters sent along with the form params.require(:quiz).permit(...) end 正确的属性中列入白名单。发送新测验处方后,您可以调试收到的参数,并检查一切是否正确。

TIP!如果您在动态添加嵌套资源时不想担心JS,我建议您使用cocoon gem