4

我有一个表格,学生可以在其中注册课程。当用户提交表单时,他就注册了课程并保存了他的付款信息。换句话说,Enrollment创建了一个对象并Student更新了该对象......除了我无法Student更新。这可能吗?如果是这样,怎么做?

我的模型...

class Student < ActiveRecord::Base
    has_many :enrollments
end

class Enrollment < ActiveRecord::Base
    belongs_to :student
    accepts_nested_attributes_for :student
end

我的(缩写)表格...

<%= form_for :enrollment, html: { id: "enrollment_form" } do |f| %>

    <%= f.fields_for :student_attributes do |student_builder| %>
        <%= student_builder.hidden_field :payment_name %>
    <% end %>

    <%= f.hidden_field :payment_token %>

    <div class="field terms">
        <%= f.check_box :agreed_to_terms %>
        <%= f.label :agreed_to_terms, "I agree to the terms and conditions." %>
    </div>

<% end %>

我的控制器...

class EnrollmentsController < ApplicationController

  def create
    @enrollment = Enrollment.new(enrollment_params)
    @enrollment.clazz_id = @clazz.id
    @enrollment.student_id = @student.id
    @enrollment.save
  end

  private
    def enrollment_params
      params.require(:enrollment).permit(:payment_token, :agreed_to_terms, student_attributes: [:payment_name])
    end
end

POST参数...

{
  "enrollment"=> {
    "student_attributes"=> {
      "payment_name"=> "MasterCard ending in 9840"
    },
    "payment_token"=> "CC11ho86XxVqsUW7Cn9YjCHg?1376007969212",
    "agreed_to_terms"=> "1"
  },
  "clazz_id"=> "7"
}

我已经在表单生成器中尝试了,的所有排列student,但它们似乎都不起作用。students_attributes

4

1 回答 1

5

好的,我看到了一些东西:

  1. 嵌套属性,如API 中所述,“允许您通过parent将属性保存在关联记录上。” 这意味着

    class Enrollment < ActiveRecord::Base
        belongs_to :student
        accepts_nested_attributes_for :student
    end
    

    本质上不起作用,因为您试图接受来自父级的嵌套属性。因此,您需要从重新考虑您的 Active Record 关联开始。

    如果我们假装这一切都是平方的,那么更多的语法错误是:

  2. 代替

    <%= f.fields_for :student_attributes do |student_builder| %>
    

    <%= f.fields_for :students do |student_builder| %>
    

    这可能会令人困惑,但传递:studentsfields_for帮助程序会调用嵌套的学生对象,而生成:student_attributes的 POST 参数中的哈希键fields_for

  3. 在您的强参数中,您还需要允许学生:id,以便您的更新操作有参考。否则,它只会创建一个新学生。所以改成

    private
      def enrollment_params
        params.require(:enrollment).permit(:payment_token, :agreed_to_terms, student_attributes: [:payment_name, :id])
      end
    

我不确定这是否就是一切,但希望这是一个开始。祝你好运。

于 2013-08-18T22:25:19.947 回答