加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:39:05 所属栏目:百科 来源:网络整理
导读:我有一个学生可以报名参加课程的表格.当用户提交表单时,他就会注册该课程并保存他的付款信息.换句话说,创建了一个Enrollment对象并更新了Student对象…除了我无法让学生更新.这可能吗?如果是这样,怎么样? 我的模特…… class Student ActiveRecord::Base h
我有一个学生可以报名参加课程的表格.当用户提交表单时,他就会注册该课程并保存他的付款信息.换句话说,创建了一个Enrollment对象并更新了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"
}

我已经尝试过在表单构建器中学生,学生,_attributes的每个排列,但它们似乎都不起作用.

解决方法

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

>嵌套属性,如the API中所述,“允许您通过父级保存关联记录的属性”.这意味着

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

本质上不起作用,因为您试图接受来自父级的嵌套属性.因此,您需要首先重新考虑您的Active Record配置.

如果我们假装全部平方,那么更多的语法错误是:
>替换

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

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

这可能令人困惑,但是传递:学生到fields_for帮助器调用嵌套的学生对象,而:student_attributes是来自fields_for产生的POST参数的哈希键.
>在强参数中,您还需要允许student:id,以便您的更新操作具有参考.否则,它只会创建一个新学生.所以改成它

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读