RoR将虚拟属性转换为两个数据库属性

时间:2015-04-21 07:57:59

标签: ruby-on-rails validation formtastic

我目前无法找到编写以下情况的好方法:

有一个名为TcpService的模型,它有两个属性,port_fromport_to,都是整数。它还有一个名为portrange的虚拟属性,它是一个String。 portrange是属性port_fromport_to的字符串表示形式,因此portrange = "80 90"应该产生port_from = 80port_to = 90。我现在要做的是为Formtastic AND creatingupdating - 对象使用相同的TcpService表单。表单看起来非常标准(HAML代码):

= semantic_form_for @tcp_service do |f|
  = f.inputs do
    = f.input :portrange, as: :string, label: "Portrange"
    -# calls @tcp_service.portrange to determine the shown value

  = f.actions do
    = f.action :submit, label: "Save"

问题是,我不知道一种非混乱的方式来使我想要的值出现在表单中。在new我希望该字段为空,如果create失败,我希望它显示错误的用户输入以及错误,否则使用{填充port_fromport_to {1}}。在portrange我希望显示editport_from的字符串表示,如果port_to失败,我希望它显示错误的用户输入以及错误,否则填充{ {1}}和update使用port_from

模特看起来像这样,这对我来说似乎很混乱。 有没有更好的方法让它达到我的需要?

port_to

感谢您阅读

1 个答案:

答案 0 :(得分:0)

在你的模特中

def portrange
  return "" if self.port_from.nil? || self.port_to.nil?
  "#{self.port_from} #{self.port_to}"
end

def portrange=(str)
  return false unless str.match /^[0-9]{1,5}\ [0-9]{1,5}/
  self.port_from = str.split(" ").first
  self.port_to = str.split(" ").last
  self.portrange
end

使用此功能,您应该可以在表单中使用portrange setter和getter。