Rails tsrange 类型的表单助手
Rails form helper for type tsrange
我有一个 period
字段类型为 tsrange
的记录。
我正在制作一个表格来创建它,我想继续使用 rails 表格助手 - 我想知道是否有某种约定来设置范围的 begin
和 end
?
在我看来:
<%= form_with(model: @record) do |record_form| %>
<%= record_form.datetime_local_field :period %>
<% end %>
导致错误undefined method 'strftime' for Mon, 01 Jan 1996 09:00:00 +0000..Mon, 01 Jan 1996 17:00:00 +0000:Range
这是有道理的,因为我不能直接为范围创建一个输入,但似乎没有任何方法可以将范围属性解压缩到它的 begin
和 end
类似
的方法
<%= record_form.datetime_local_field :period_begin %>
因为那个错误
undefined method 'period_begin' for #<ShiftPeriod id: nil, shift_pattern_id: nil, period: Mon, 01 Jan 1996 09:00:00 +0000..Mon, 01 Jan 1996 17:00:00 +0000, created_at: nil, updated_at: nil>
除了手动构建输入之外,还有什么方法可以为此范围字段类型构建输入吗?
谢谢!
我认为您必须为这些值添加自定义 getter 和 setter:
def period_begin
# using read_attribute because I'm redefining the `period` getter at the end
@period_begin = read_attribute(:period)&.begin
end
def period_end
@period_end = read_attribute(:period)&.end
end
def period_begin=(value)
@period_begin = value
end
def period_end=(value)
@period_end = value
end
def period
period_begin..period_end if period_begin && period_end
end
对此不是 100% 确定(我从未使用过 tsrange 类型),但希望这个想法(也许每个 getter/setter 的实现都不正确)对您有所帮助。
然后 period_end
和 period_begin
应该在呈现表单时起作用,并且在您提交表单时设置属性时应该起作用。
我有一个 period
字段类型为 tsrange
的记录。
我正在制作一个表格来创建它,我想继续使用 rails 表格助手 - 我想知道是否有某种约定来设置范围的 begin
和 end
?
在我看来:
<%= form_with(model: @record) do |record_form| %>
<%= record_form.datetime_local_field :period %>
<% end %>
导致错误undefined method 'strftime' for Mon, 01 Jan 1996 09:00:00 +0000..Mon, 01 Jan 1996 17:00:00 +0000:Range
这是有道理的,因为我不能直接为范围创建一个输入,但似乎没有任何方法可以将范围属性解压缩到它的 begin
和 end
类似
<%= record_form.datetime_local_field :period_begin %>
因为那个错误
undefined method 'period_begin' for #<ShiftPeriod id: nil, shift_pattern_id: nil, period: Mon, 01 Jan 1996 09:00:00 +0000..Mon, 01 Jan 1996 17:00:00 +0000, created_at: nil, updated_at: nil>
除了手动构建输入之外,还有什么方法可以为此范围字段类型构建输入吗? 谢谢!
我认为您必须为这些值添加自定义 getter 和 setter:
def period_begin
# using read_attribute because I'm redefining the `period` getter at the end
@period_begin = read_attribute(:period)&.begin
end
def period_end
@period_end = read_attribute(:period)&.end
end
def period_begin=(value)
@period_begin = value
end
def period_end=(value)
@period_end = value
end
def period
period_begin..period_end if period_begin && period_end
end
对此不是 100% 确定(我从未使用过 tsrange 类型),但希望这个想法(也许每个 getter/setter 的实现都不正确)对您有所帮助。
然后 period_end
和 period_begin
应该在呈现表单时起作用,并且在您提交表单时设置属性时应该起作用。