gpt4 book ai didi

ruby-on-rails - 在到达模型验证之前捕获自定义访问器中引发的异常(并在错误 [] 中向用户显示)

转载 作者:行者123 更新时间:2023-12-03 16:02:38 25 4
gpt4 key购买 nike

我已经浏览了 API 并花了两个晚上盯着这段代码,不幸的是,虽然我感觉我已经接近解决方案了,但我无法让它工作。我有一个代表类次的模型,其中包括一个开始时间。

create_table "shifts", :force => true do |t|
t.datetime "start"

用户与此交互的时间很简单,因为日期在其他地方设置,因此我设置了虚拟访问器来获取和设置。
class Shift < ActiveRecord::Base
def start_time
start.strftime("%H:%M")
end

def start_time=(time)
date = start.midnight
self.start = add_string_time_to_date(date, time)
end

def add_string_time_to_date(date, string_time)
t = DateTime.strptime(string_time, "%H:%M")
DateTime.new(date.year, date.month, date.mday, t.hour, t.min)
end
end

当通过带有 @shift.update_attributes(params[:shift]) 的标准 Controller 进行操作时,这一切正常。只要以预期的格式输入时间。

我想验证输入的时间格式,但它不像使用以下方法那么简单 strptime()在达到验证之前引发 ArgumentError 。
validates :start_time, :format => { :with => /^([0-1][0-9]|[2][0-3]):([0-5][0-9])$|^/, 
:message => "Invalid format." }

我可以通过在 start_time() 中放置条件调用来解决此问题例如下面的示例,但由于两个原因,这并不能真正令人满意地工作。
def start_time=(time)
if time =~ /^([0-1][0-9]|[2][0-3]):([0-5][0-9])$|^/
date = start.midnight
self.start = add_string_time_to_date(date, time)
else
errors.add :start, "format invalid."
nil
end
end

第一个 ActiveRecord 似乎不知道 setter 失败了。我从 Controller 中 update_attributes() 返回的事实推断出这一点,好像一切都很好,即使它不是。其次,没有返回给用户的反馈,因此对 errors.add 的调用可能是脱离上下文的。它也有点丑。

所需的功能是标准验证的功能,因此如果它失败,用户会在表单上看到错误,就像他们遇到任何其他验证失败一样。简而言之, 我如何实现这个功能,我是否以正确的方式接近这个?

我是否需要引发特定的异常才能通知 ActiveRecord 出现问题,如果是这样,最好在哪里这样做?最好只是救援和使用闪光灯?

最佳答案

你最好把这些属性的逻辑分开。

  • 首先为 start_time 定义一个 attr_accessor(即使它只保存在内存中)。
  • 然后相应地初始化该值。
  • 最后只在保存模型时设置 start 属性。

  • 这看起来像:
    class Shift < ActiveRecord::Base
    attr_accessor :start_time

    after_initialize :default_values
    before_save :set_start

    def add_string_time_to_date(date, string_time)
    t = DateTime.strptime(string_time, "%H:%M")
    DateTime.new(date.year, date.month, date.mday, t.hour, t.min)
    end

    private

    def default_values
    self.start_time = start.strftime("%H:%M") if start_time.nil? && start.present?
    end

    def set_start
    if self.start_time.present?
    date = start.midnight
    self.start = add_string_time_to_date(date, time)
    end
    end

    end

    关于ruby-on-rails - 在到达模型验证之前捕获自定义访问器中引发的异常(并在错误 [] 中向用户显示),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8795287/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com