簡體   English   中英

Rails - 將嵌套參數從表單傳遞到 controller

[英]Rails - Passing nested params from a form into a controller

我正在使用 Rails Strong 參數來幫助允許嵌套輸入參數,並且似乎遇到了問題。 我在這里關注accepts_nested_attributes_for的 rails 文檔,但運氣不佳,因為我的數據庫關系有點復雜。 非常感謝 Rails 社區在將我的輸入傳遞到后端的幫助。

我的數據庫關系:

票證 Model:

class Ticket < ActiveRecord::Base
  belongs_to :device, polymorphic: true
end

設備 Model:

class Device < ActiveRecord::Base
  has_many :tickets, as: :device
  has_many :addresses, foreign_key: 'device_id'

  accepts_nested_attributes_for :addresses
end

地址 Model:

class Address < ActiveRecord::Base
  belongs_to :device
end

有了這些關系,我就有了一個創建工單的表單。 該表單應允許在表單上指定用於創建Address對象的address輸入列表,並且addresses列表進一步與Device本身相關聯。

以下是我在創建Ticket期間傳遞這些嵌套輸入參數的方式:

票證 controller:

def create
  ticket = Ticket::Creator.call(ticket_params: ticket_params)
  redirect_to path(ticket)
end

private

def ticket_params
  params.require(:ticket).permit(
    {
      device: %i[#device_params],
      address_attributes: %i[name] # name is input by the user.
    }
  )
end

按照我現在設置的方式, controller 應該首先創建一個 Ticket,然后創建一個Device和一個與Device相關的Address對象列表。 但我似乎無法閱讀表單上的address_attributes

這是我在表格上抓取它們的方式:

name: 'ticket[device][addresses][][name]'

我在這里做錯了什么嗎? 如果我可以在這里提供更多信息,請告訴我。

您應該像這樣使用 accept_nested_attributes :

class Ticket < ActiveRecord::Base
   belongs_to :device, polymorphic: true
   accepts_nested_attributes_for :device
end 

class Device < ActiveRecord::Base
  has_many :tickets, as: :device
  has_many :addresses, foreign_key: 'device_id'

  accepts_nested_attributes_for :addresses
end

class Address < ActiveRecord::Base
  belongs_to :device
end

使用 model 設置,您可以在 TicketController 中使用具有嵌套這樣的強參數:

def create
  ticket = Ticket.create(ticket_params)
  redirect_to path(ticket)
end

private

def ticket_params
  params.require(:ticket).permit(
      device_attributes: [
          addresses_attributes: [:name]
      ]          
  )
end

請記住,要創建多個地址,您需要傳遞以下地址屬性: ticket[device_attributes][addresses_attributes][][name]

我建議你過度考慮你的多態關系。 由於這種關系,您需要在您的ticket_params中傳遞一個device_type

暫無
暫無

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

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