【问题标题】:类型 tsrange 的 Rails 表单助手
【发布时间】:2022-01-23 06:39:09
【问题描述】:

我有一个 period 字段类型为 tsrange 的记录。 我正在制作一个表单来创建它,我想继续使用 rails 表单助手 - 我想知道是否有某种约定来设置范围的 beginend 的日期?

在我看来:

<%= 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

这是有道理的,因为我不能直接为范围创建一个输入,但似乎没有任何方法可以将范围属性解压缩到其 beginend 方法中,例如

&lt;%= record_form.datetime_local_field :period_begin %&gt;

因为那个错误

undefined method 'period_begin' for #&lt;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&gt;

除了手动构建输入之外,还有什么方法可以为此范围字段类型构建输入? 谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby activerecord ruby-on-rails-7


    【解决方案1】:

    我认为您必须为这些值添加自定义 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_endperiod_begin 在呈现表单时应该可以工作,并且在您提交表单时设置属性时应该可以工作。

    【讨论】:

    • 谢谢!我会尝试一下 - 不知道这很容易做到,当你做#new时很难弄清楚activerecord在幕后做了什么
    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    相关资源
    最近更新 更多