具有可互换模型的Formtastic多态形式

时间:2015-08-06 13:18:00

标签: ruby-on-rails polymorphism haml formtastic

所以我在为具有多态关联的模型实现表单时遇到问题。问题是,我需要在两种不同的型号之间进行选择。我正在使用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_fromipable_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_fromIp,则显示ip_string并保持id不变。如果ipable_fromIpGroup,则ip_string将留空,并且在选择框中选择了id IpGroup

0 个答案:

没有答案