【问题标题】:Deep Nested Rails 4 Form深层嵌套 Rails 4 形式
【发布时间】:2014-01-08 10:29:38
【问题描述】:

我有 3 个模型 Item 接受问题的嵌套属性,问题接受答案的嵌套属性。我正在尝试创建一个具有相同形式的问题和答案的项目。

item.rb

class Item < ActiveRecord::Base
  has_many :questions, dependent: :destroy
  accepts_nested_attributes_for :questions
end

question.rb

class Question < ActiveRecord::Base
  belongs_to :item

  has_many :answers, dependent: :destroy
  accepts_nested_attributes_for :answers
end

answer.rb

class Answer < ActiveRecord::Base
  belongs_to :question
end

item_controller.rb

class ItemsController < ApplicationController
    def new
      @item = @repository.items.new
      questions = @item.questions.build
      answers = questions.answers.build
    end

    def create
      @item = Item.new(item_params)
      if @item.save
          redirect_to @item, notice: '...'
      else
          render action: 'new'
      end
    end

  private
  def item_params
      params.require(:item).permit(:id, :content, :kind, :questions_attributes => [:content, :helper_text, :kind], :answers_attributes => [:content, :correct])
  end   
end

_form.haml

= simple_form_for(@item) do |f|
    = f.input :kind
    = f.input :content
    = f.simple_fields_for :questions do |q|
        = q.input :content
        = q.simple_fields_for :answers do |a|
            = a.input :content
    = f.submit

表格显示正确,正确保存了问题模型。我似乎无法保存答案

我已经查看了很多在线帮助,但没有一个包含 Rails 4 strong params。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 simple-form strong-parameters


    【解决方案1】:

    我认为您的问题在于您的强大参数:

    def item_params
          params.require(:item).permit(:id, :content, :kind, questions_attributes: [:content, :helper_text, :kind, answers_attributes: [:content, :correct]])
    end   
    

    基本上,当您传递深层嵌套表单(其中有多个依赖模型)时,您必须将属性作为其他模型属性的一部分传递。你有单独的参数

    【讨论】:

    • 我认为这将是一个与此类似的答案,但感谢您提供的示例。
    【解决方案2】:

    我遇到了类似的问题,虽然 Richard Peck 的回答对我也有帮助,但我缺少一件事。

    如果您是深度嵌套,则需要指定嵌套项的父项的 id。在这种情况下,要创建answers,您需要将questions id 设为显式q.input :id,否则您将遇到error

    = simple_form_for(@item) do |f|
        = ...
        = f.simple_fields_for :questions do |q|
            = ...
            = q.input :id
            = q.simple_fields_for :answers do |a|
                = ...
        = f.submit
    

    【讨论】:

    • 谢谢! + 我还需要定义 inverse_of - here is example 如果有人需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多