[英]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.