【问题标题】:Edit/create nested resources in Formtastic (Rails)在 Formtastic (Rails) 中编辑/创建嵌套资源
【发布时间】:2016-08-02 14:17:38
【问题描述】:

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

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

  • 测验(has_many :quiz_questions),例如“测试一下你有多棒”
  • 测验问题(belongs_to :quiz, has_many :quiz_options)。例如“1. 你最喜欢哪种颜色”)
  • 测验选项(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 第一个并向其添加值(如“名称标签”)。点击创建。
  3. 添加与第一个 QuizQuestion 相关的 QuizOption 及其“名称标签”。单击创建。
  4. 重复 QuizQuestion/QuizOption 直到测验完成。

我该怎么做?

【问题讨论】:

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


    【解决方案1】:

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

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

    声明如下:

    has_many :quiz_questions
    accepts_nested_attributes_for :quiz_questions
    

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

    # using the previously quiz model
    quiz.quiz_questions.create(...)
    

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


    您在表单上看不到任何字段的原因可能是因为没有创建嵌套对象。让我解释。当您创建一个新的 Quiz 对象时,在您的 quizs_controller(或任何测验的变形......)中,您需要:

    def new
      quiz = Quiz.new()
    end
    

    def create
      Quiz.new(quiz_params)
    end
    
    private
    
    def quiz_params
      # whitelisted parameters sent along with the form
      params.require(:quiz).permit(...) 
    end
    

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

    请注意,要使用此表单,您必须将 quizzes_controller 中的正确属性列入白名单。发送新的测验公式后,您可以调试收到的参数并检查一切是否正确。

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

    【讨论】:

    • 效果很好,尤其是在使用“茧”时。谢谢!
    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多