所以我在为具有多态关联的模型实现表单时遇到问题。问题是,我需要在两种不同的型号之间进行选择。我正在使用HAML和Formtastic。如果有人想知道模型,那就是防火墙访问列表规则。
class Rule < ActiveRecord::Base
belongs_to :ipable_from, foreign_key: 'ipable_from_id', polymorphic: true
belongs_to :ipable_to, foreign_key: 'ipable_to_id', polymorphic: true
end
class Ip < ActiveRecord::Base
has_many :rules_from, class_name: "Rule", foreign_key: 'ipable_from_id', as: :ipable_from
has_many :rules_to, class_name: "Rule", foreign_key: 'ipable_to_id', as: :ipable_to
has_and_belongs_to_many :ip_groups
end
class IpGroup < ActiveRecord::Base
has_many :rules_from, class_name: "Rule", foreign_key: 'ipable_from_id', as: :ipable_from
has_many :rules_to, class_name: "Rule", foreign_key: 'ipable_to_id', as: :ipable_to
has_and_belongs_to_many :ips
end
= semantic_form_for @rule do |f|
-#...
= f.semantic_fields_for :ipable_from do |ipf|
= ipf.input :ip_string, as: :string
= ipf.input :name, as: :select, collection: @ip_groups
-#...
:ipable_to
存在相同的输入字段。我希望它像这样处理:如果IpGroup
的选择框留空,则处理ip_string
,产生Ip
,否则ipable
引用所选的IpGroup
。但是,在评估表单时,Formtastic会自动采用对象ipable_from
和ipable_to
的当前模型,因此当ipable_from
当前为Ip
时,它会告诉我,找不到name
的属性Ip
。那是因为它是IpGroup
的属性。有没有办法告诉Formtastic如下构建表单:
= semantic_form_for @rule do |f|
-#...
= f.semantic_fields_for :ipable_from, as: :ip do |ipf|
= ipf.input :ip_string, as: :string
= f.semantic_fields_for :ipable_from, as: :ip_group do |ipf|
= ipf.input :name, as: :select, collection: @ip_groups
-#...
例如,如果ipable_from
是Ip
,则显示ip_string
并保持id
不变。如果ipable_from
是IpGroup
,则ip_string
将留空,并且在选择框中选择了id
IpGroup
。