【问题标题】:Assigning attr_accessor using fixtures in Rails在 Rails 中使用固定装置分配 attr_accessor
【发布时间】:2012-12-05 10:24:35
【问题描述】:

我有一个简单的 Rails 3 模型,带有一个在数据库中没有字段的 attr_accessor,由于我的初始化设置,我需要使用固定装置进行设置。

但是当我尝试它时,我收到关于未知列的错误。

还有其他方法可以做到这一点吗?

我的模特:

class Timeslot < ActiveRecord::Base
    attr_accessor :interval
    after_initialize :init

    def init
        self.interval ||= 15
        self.start_time ||= Time.local(0, 1, 1)
        self.end_time = self.start_time.advance :minutes => self.interval
    end
end

【问题讨论】:

  • 1.为什么要使用 ||= 进行初始化? 2. 我想知道你是否打算写def initialize...
  • @Elland 我正在使用 after_initialize 宏,因为我想设置默认值,因此要设置 ||=。我之前尝试过使用def initialize,遇到了问题,不记得是什么了...

标签: ruby-on-rails testing fixtures attr-accessor


【解决方案1】:

夹具处于结束状态。这意味着,在您调用 attr_accessor 之后,您的数据库中的内容将被输出。因此,如果您在像@timeslot = timeslots(:your_name_of_fixture) 这样的测试中使用它,则始终会为您计算end_time。您无需担心它们在 Fixture 中,除非您在设置它时。

现在,我以前没有见过after_initialize,但我看到它是一个回调函数。对我来说,您是在视图中设置间隔。可能不是以编程方式(除非是默认的 15 分钟)。

切换到before_save 回调(如果您希望您的人员也能够更改编辑间隔),例如:


class Timeslot < ActiveRecord::Base
    attr_accessor :interval
    before_save :set_times
    def set_times
        self.interval ||= 15
        self.start_time ||= Time.local(0, 1, 1)
        self.end_time = self.start_time.advance minutes: self.interval
    end
end

【讨论】:

    【解决方案2】:

    夹具将数据直接添加到数据库中。如果您想将数据传递给模型,请考虑使用工厂(Factory Girl 是一个很好的库)。

    您可能已经在固定装置上进行了大量投资,但工厂非常值得一看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      相关资源
      最近更新 更多