我目前无法找到编写以下情况的好方法:
有一个名为TcpService
的模型,它有两个属性,port_from
和port_to
,都是整数。它还有一个名为portrange
的虚拟属性,它是一个String。 portrange
是属性port_from
和port_to
的字符串表示形式,因此portrange = "80 90"
应该产生port_from = 80
,port_to = 90
。我现在要做的是为Formtastic
AND creating
和updating
- 对象使用相同的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_from
和port_to
{1}}。在portrange
我希望显示edit
和port_from
的字符串表示,如果port_to
失败,我希望它显示错误的用户输入以及错误,否则填充{ {1}}和update
使用port_from
。
模特看起来像这样,这对我来说似乎很混乱。 有没有更好的方法让它达到我的需要?
port_to
感谢您阅读
答案 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。