簡體   English   中英

使用強參數插入和更新嵌套的“belongs_to”關聯

[英]Insert & Update with strong parameters for nested `belongs_to` association

我有一個學生可以報名參加課程的表格。 當用戶提交表單時,他就會注冊該課程並保存他的付款信息。 換句話說,創建了一個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"
}

我已經嘗試過在表單構建器studentstudents_attributes每個排列,但它們似乎都不起作用。

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

  1. 嵌套屬性,如API所述 ,“允許您通過 父級保存關聯記錄的屬性”。 這意味着

     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是來自fields_for產生的POST參數的哈希鍵。

  3. 在強參數中,您還需要允許student :id以便您的更新操作具有參考。 否則,它只會創建一個新學生。 所以改成它

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

我不確定這是否一切,但希望這是一個開始。 祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM