【问题标题】:Combining Virtual Attributes into one real attribute not saving from view - Active Record将虚拟属性组合成一个不从视图中保存的真实属性 - Active Record
【发布时间】:2011-12-13 02:12:09
【问题描述】:

我正在使用虚拟属性在视图中拆分逗号分隔的参数列表,然后尝试重新组合它们以保存到我的 Active Record 模型中。

给定默认为“1,1,1,1”的真实属性“ad_columns”

我将它们分解为表单的各个属性:

attr_accessor :top_rows

#Getter
def top_rows
  split = ad_rows.split(',', 4)
  split[0]
end

#Setter
def top_rows=(trows)
  ad_rows_will_change!
  self.ad_rows = [trows, self.right_rows, self.bottom_rows, self.left_rows].join(",")
end

然后对右、下、左和右重复此操作。

如果我调用“object.top_rows”给定一个对象,我会得到“1”,如果我在 irb 中更新它:

object.top_rows = "3"

然后它会正确更新 ad_rows 真实属性。我可以看到对象发生了变化,当我做一个

object.save

更改在数据库中更新。

问题是,这在视图中不起作用。它不会保存到数据库中。我什至使用 logger.info 来查看模型是否已更改,它会显示“ad_rows”确实已更改,但活动记录仍未更新真实属性。

我不知道为什么会这样。我只是做错了吗? :) 谢谢。

为什么它可以在 irb 中工作而不是在视图中?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    我会先摆脱attr_accessor :tops_rows

    该行为获取和设置实例变量 @top_rows 创建了额外且可能冲突的实例方法,并且不会触及 ActiveRecord 属性。

    至于为什么它在视图中不起作用,我会检查您是否已在模型中将:ad_rows 添加到attr_accessible。这允许 ActiveRecord 在批处理操作中对列进行更改(更改多个属性)。 Documentation.

    【讨论】:

      【解决方案2】:

      似乎由于属性 :ad_rows 没有被传递到参数中,所以它没有被控制器识别为更改。

      我必须补充:

      object.ad_rows_will_change!

      到我的控制器强制它保存 ad_rows 列。

      我不确定这是否是最好的解决方案,但它现在可以工作。

      【讨论】:

        猜你喜欢
        • 2019-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-18
        • 2020-01-05
        • 2015-09-10
        相关资源
        最近更新 更多