无法使用属于的自定义操作插入数据有很多关系 rails

unable to insert data using custom action by belongs with has many relationship rails

我的关系是:

class PrivateClass < ActiveRecord::Base
  has_many :lesson_plans
end

class LessonPlan < ActiveRecord::Base
   belongs_to :private_class
end

我的表格是这样的:

<%= form_tag (add_lesson_plan_teacher_teacher_private_school_private_class_path), remote: true do %>
    <div class="row">
      <div class="col-sm-6">
        <div class="form-group">
          <%= label_tag :title, nil, :class => "control-label" %>
          <%= text_field_tag "private_class[lesson_plan][title]", "", class: "form-control first_input", required: true, style: "width: 210%;" %>
        </div>
        <div class="form-group">
          <%= label_tag :description, nil, :class => "control-label" %>
          <%= text_area_tag "private_class[lesson_plan][description]", "", placeholder: "Enter Description Here", class: "form-control", rows: "3", required: true, style: "width: 210%;" %>
        </div>
        <div class="form-group">
          <%= label_tag :notes, nil, :class => "control-label" %>
          <%= text_area_tag "private_class[lesson_plan][notes]", "", placeholder: "Enter Notes Here", class: "form-control", rows: "3", required: true, style: "width: 210%;" %>
        </div>
        <div class="form-group">
          <%= submit_tag "Create lesson plan", :class => "btn btn-info" %>
        </div>
      </div>
    </div>
<% end %>

我的控制器:

class Teacher::PrivateClassesController < ApplicationController

  before_action :authenticate_user!
  before_action :set_teacher
  before_action :set_private_school
  before_action :set_private_class

  def add_lesson_plan
    @lesson_plan = @private_class.lesson_plans.new(private_class_params).save
  end

  private

  def private_class_params
    params.require(:private_class).permit!
  end

  def set_teacher
    @teacher = Teacher.friendly.find(params[:teacher_id])
  end

  def set_private_school
    @private_school = PrivateSchool.friendly.find(params[:private_school_id])
  end

  def set_private_class
    @private_class = PrivateClass.find(params[:id])
  end
end

路线是:

resources :private_schools do
        resources :private_classes do
          member do
            get :lesson_plan
            post :lesson_plan
            post :add_lesson_plan
          end
        end
      end

现在的问题是,当我尝试在教案中插入数据时 table 它说:

ActiveRecord::UnknownAttributeError (unknown attribute 'lesson_plan' for LessonPlan.):
  app/controllers/teacher/private_classes_controller.rb:11:in `add_lesson_plan'

我需要做的是将教案字段数据输入教案 table 和 private_class_id 如有不妥请指正

更新

这里是 puts 语句的结果:

def add_lesson_plan
    puts params.inspect, '++++++++++++++++++++++++'
    puts @private_class.lesson_plans.new.inspect, '**************************************'
    @lesson_plan = @private_class.lesson_plans.new(private_class_params).save!
  end

{"utf8"=>"✓", "private_class"=>{"lesson_plans"=>{"title"=>"ggd", "description"=>"gghh", "notes"=>"gggkd"}}, "commit"=>"Create lesson plan", "controller"=>"teacher/private_classes", "action"=>"add_lesson_plan", "teacher_id"=>"carmel-cynthia", "private_school_id"=>"dr-jasmine-e-mcnair-high-school", "id"=>"1"}
++++++++++++++++++++++++
#<LessonPlan id: nil, title: nil, description: nil, notes: nil, subject_id: nil, teacher_id: nil, created_at: nil, updated_at: nil, is_private: true, is_publish: false, user_id: nil, publish_date: nil, popularity_count: 0, is_special: false, private_class_id: 1>
**************************************

params:

{"utf8"=>"✓", "private_class"=>{"lesson_plans"=>{"title"=>"ggd", "description"=>"gghh", "notes"=>"gggkd"}}, "commit"=>"Create lesson plan", "controller"=>"teacher/private_classes", "action"=>"add_lesson_plan", "teacher_id"=>"carmel-cynthia", "private_school_id"=>"dr-jasmine-e-mcnair-high-school", "id"=>"1"}

private_class_params 方法可能是 returning:

{"lesson_plans"=>{"title"=>"ggd", "description"=>"gghh", "notes"=>"gggkd"}}

但你实际需要lesson_plans的内容,所以改成:

def private_class_params
  params.require(:private_class).permit![:lesson_plans]
end

或将您的表单调整为 post 预期的形状 ;)

编辑

params.require(:private_class).permit! returns private_class键的内容,是一个hash...然后[:lesson_plans] return [=16的内容=] 在该散列中键入,这是创建对象所需的属性...

您可以在控制台中尝试以下操作来了解它:

params = {"utf8"=>"✓", "private_class"=>{"lesson_plans"=>{"title"=>"ggd", "description"=>"gghh", "notes"=>"gggkd"}}, "commit"=>"Create lesson plan", "controller"=>"teacher/private_classes", "action"=>"add_lesson_plan", "teacher_id"=>"carmel-cynthia", "private_school_id"=>"dr-jasmine-e-mcnair-high-school", "id"=>"1"}
#=> {"utf8"=>"✓", "private_class"=>{"lesson_plans"=>{"title"=>"ggd", "description"=>"gghh", "notes"=>"gggkd"}}, "commit"=>"Create lesson plan", "controller"=>"teacher/private_classes", "action"=>"add_lesson_plan", "teacher_id"=>"carmel-cynthia", "private_school_id"=>"dr-jasmine-e-mcnair-high-school", "id"=>"1"}
params['private_class'] # similar to the result of your private_class_params method
#=> {"lesson_plans"=>{"title"=>"ggd", "description"=>"gghh", "notes"=>"gggkd"}}
params['private_class']['lesson_plans'] # the attributs you actually need
#=> {"title"=>"ggd", "description"=>"gghh", "notes"=>"gggkd"}