gpt4 book ai didi

ruby-on-rails - Ruby on Rails 中的多态性和表单

转载 作者:行者123 更新时间:2023-12-04 05:59:29 25 4
gpt4 key购买 nike

我最近充满了问题,但多亏了这个很棒的社区,我学到了很多东西。

我之前得到了多态关联所需的所有帮助,现在我有一个关于使用多态模型处理表单的问题。例如,我有 Phoneable 和 User,所以当我创建表单来注册用户时,我希望能够为用户分配一些电话号码(即:手机、工作、家庭)。

class User < ActiveRecord::Base
has_many :phones, :as => :phoneable
end

class Phone < ActiveRecord::Base
belongs_to :phoneable, :polymorphic => true
end

class CreateUsers < ActiveRecord::Migration
t.column :name, :string
t.references :phoneable, :polymorphic => true
end

class CreatePhones < ActiveRecord::Migration
t.column :area_code, :integer
t.column :number, :integer
t.column :type, :string
t.references :phoneable, :polymorphic => true
end

现在,当我创建表单时,我感到很困惑。通常我会做以下事情:
- form_for :user, :html => {:multipart => true} do |form|
%fieldset
%label{:for => "name"} Name:
= form.text_field :name
##now how do I go about adding a phone number?
##typically I'd do this:
##%label{:for => "phone"} Phone:
##= form.text_field :phone

使用多态,我会不会以同样的方式接近,但使用fields_for?
- user_form.fields_for :phone do |phone| %>
%label{for => "area_code"} Area Code:
= phone.text_field :area_code
%label{for => "number"} Number:
= phone.text_field :number

在这种情况下,这是正确的方法吗?

最佳答案

在我们继续之前,我确实注意到一个问题 - 您不需要 t.referenceshas_many协会的一侧。所以你不需要它在 create_user模型。它所做的是创建 phonable_idphoneable_type列,您只需要在多态模型中使用它。

您正朝着正确的道路前进 fields_for方法。但是为了让它工作,你需要告诉模型如何处理这些字段。您可以通过 accepts_nested_attributes_for 做到这一点类方法。

class User < ActiveRecord::Base
has_many :phones, :as => :phoneable

accepts_nested_attributes_for :phones
end

还有一件小事,您需要拥有 fields_for指向关联的确切名称
- form_for @user do |user_form|
- user_form.fields_for :phones do |phone|

代替
- form_for @user do |user_form|
- user_form.fields_for :phone do |phone|

并确保您移除您的流浪狗 %> erb 标签 :)

更多关于 accepts_nested_attributes_for : http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

我希望这有帮助!

关于ruby-on-rails - Ruby on Rails 中的多态性和表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3327236/

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