【问题标题】:Creating associated object from collection select从集合选择创建关联对象
【发布时间】:2017-03-15 03:25:12
【问题描述】:

我有多个Lessons,其中大多数都有一些先决条件,这些先决条件本身就是其他课程。 Prerequisite 模型代表关系,每个模型都有一个lesson_idprerequisite_lesson_id

class Lesson < ApplicationRecord
  has_many :prerequisites
  has_many :prerequisite_lessons, :through => :prerequisites
end

class Prerequisite < ApplicationRecord
  belongs_to :lesson
  belongs_to :prerequisite_lesson, :class_name => "Lesson"
end

我正在想办法:

  • 当我创建一个新的Lesson 并从collection_select 中选择一个或多个先决条件时
  • 多个Prerequisite 对象根据所选内容创建,lesson_id 是创建的Lesson id。

这是我的课程控制器的一部分:

def create
  @lesson = Lesson.new(lesson_params)

  if @lesson.save
    if @lesson.prerequisite_ids.length > 0
      @lesson.prerequisite_ids.each do |p|
        Prerequisite.new(lesson_id: @lesson.id, prerequisite_lesson_id: p)
      end
    end
    flash[:notice] = "Lesson created..."
    redirect_to root_url
  else
    render :new
  end
end

...

def lesson_params
  params.require(:lesson).permit(
    :name,
    :high_tempo,
    :low_tempo,
    :interval,
    :advance_tempo,
    prerequisites_attributes: [
      :lesson_id,
      :prerequisite_lesson_id
    ]
  )
end

还有我的表格:

<%= f.collection_select(:prerequisite_ids, Lesson.all, :id, :name, {}, {:multiple => true}) %>

更新:

在日志中,我看到:

"课程"=>{"名称"=>"第 6 课", "high_tempo"=>"200", "low_tempo"=>"100", "interval"=>"10", "advance_tempo"=>"140", "prerequisite_ids"=>["", "3", "4"]}, "commit"=>"Save"} 不允许 参数:prerequisite_ids'`

【问题讨论】:

    标签: ruby-on-rails forms associations


    【解决方案1】:

    这里似乎有几个问题:

    一个是你正在使用Prerequisite.new(...),而我认为你想使用Prerequisite.create(...)

    所以你的创建动作应该是:

    def create
      @lesson = Lesson.new(lesson_params)
    
      if @lesson.save
        if @lesson.prerequisite_ids.length > 0
          @lesson.prerequisite_ids.each do |p|
            Prerequisite.create(lesson_id: @lesson.id, prerequisite_lesson_id: p)
          end
        end
        flash[:notice] = "Lesson created..."
        redirect_to root_url
      else
        render :new
      end
    end
    

    另一个是这个(来自你的日志):

    "课程"=>{"名称"=>"第 6 课", "high_tempo"=>"200", "low_tempo"=>"100", "interval"=>"10", "advance_tempo"=>"140", "prerequisite_ids"=>["", "3", "4"]}, "commit"=>"Save"} 不允许 参数:prerequisite_ids'`

    在您的控制器中,您允许

    def lesson_params
      params.require(:lesson).permit(
        :name,
        :high_tempo,
        :low_tempo,
        :interval,
        :advance_tempo,
        prerequisites_attributes: [
          :lesson_id,
          :prerequisite_lesson_id
        ]
      )
    end
    

    但请注意,您的实际数据以"lesson" =&gt; {..., "prerequisite_ids"=&gt;["", "3", "4"]} 的形式出现

    所以你应该像这样允许:

    def lesson_params
      params.require(:lesson).permit(
        :name,
        :high_tempo,
        :low_tempo,
        :interval,
        :advance_tempo,
        prerequisite_ids: []
      )
    end
    

    此外,您的 prerequisite_ids 似乎包含一个空字符串值。基于this post,您可能需要将include_hidden: true 添加到您的选择标签中,如下所示:

    <%= f.collection_select(:prerequisite_ids, Lesson.all, :id, :name, {}, {:multiple => true, include_hidden: true}) %>
    

    【讨论】:

    • 这就是我在日志中看到的内容:'参数:{"utf8"=>"✓", "authenticity_token"=>"THaOnTF4jPv6duqqyxRMP7IIfpEPS9MrFJ5Ib50WohwyvP8dd085P0UQeD47jW2a65tI3eNeHVU0IZwwL="=>h,"less name"=>"第 6 课", "high_tempo"=>"200", "low_tempo"=>"100", "interval"=>"10", "advance_tempo"=>"140", "prerequisite_ids"=> ["", "3", "4"]}, "commit"=>"Save"} 不允许的参数:prerequisite_ids'
    • 我已经更新了我的答案以解决另一个问题,我相信你已经看到了。
    • 不幸的是,我似乎仍然收到相同的“Unpermitted parameter”错误。
    • 看起来像一个数组参数,你必须允许它。我刚刚更新了我的答案的最后一点,你可以试试吗?
    • '参数:{"utf8"=>"✓", "authenticity_token"=>"bjCBqvh+babDcXymJigWsCuP9AVKsRo2ZbvkEXXXMtwQ+vAqvknYYnwX7jLWsTcVchzCSaak1EhFBDB1Ate5mw==", "testing""=>{"name"=> , "high_tempo"=>"200", "low_tempo"=>"100", "interval"=>"10", "advance_tempo"=>"140", "prerequisite_ids"=>["", "3", "4"]}, "commit"=>"Save"} 先决条件加载 (0.4ms) SELECT "prerequisites".* FROM "prerequisites" WHERE "prerequisites"."id" IN (3, 4) Completed 500 Internal Server Error在 27ms (ActiveRecord: 0.9ms) ActiveRecord::AssociationTypeMismatch (Prerequisite(#69945275660660) 预期,得到 NilClass(#5898200)):'
    猜你喜欢
    • 2018-11-13
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多