gpt4 book ai didi

ruby-on-rails - 使用强参数插入和更新嵌套 `belongs_to` 关联

转载 作者:行者123 更新时间:2023-12-05 01:07:48 27 4
gpt4 key购买 nike

我有一个表格,学生可以在其中注册类(class)。当用户提交表单时,他就注册了类(class)并保存了他的付款信息。换句话说,一个 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 %>

我的 Controller ...
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在表单构建器中,但它们似乎都不起作用。

最佳答案

好的,我看到了一些事情:

  • 嵌套属性,如 the API 中所述, “允许您保存关联记录的属性 。”这意味着
    class Enrollment < ActiveRecord::Base
    belongs_to :student
    accepts_nested_attributes_for :student
    end

    本质上是行不通的,因为您试图接受嵌套属性 来自 parent 。所以你需要从重新考虑你的 Active Record 关联开始。

    如果我们假装这一切都没有问题,那么更多的语法错误是:
  • 代替
    <%= f.fields_for :student_attributes do |student_builder| %>


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

    这可能会令人困惑,但通过 :studentsfields_for helper 调用嵌套的学生对象,而 :student_attributes是来自 fields_for 的 POST 参数的哈希键产生。
  • 在你的强参数中,你还需要允许学生:id以便您的更新操作具有引用。否则,它只会创建一个新学生。所以改成
    private
    def enrollment_params
    params.require(:enrollment).permit(:payment_token, :agreed_to_terms, student_attributes: [:payment_name, :id])
    end

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

    关于ruby-on-rails - 使用强参数插入和更新嵌套 `belongs_to` 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18138559/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com