我正在使用虚拟属性在视图中打破逗号分隔的参数列表,然后尝试重新组合它们以保存到我的Active Record模型中。
鉴于真实属性“ad_columns”默认为“1,1,1,1”
我正在将它们分解为表单的各个属性:
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中起作用而在视图中不起作用?
答案 0 :(得分:0)
我首先要摆脱attr_accessor :tops_rows
。
该行为获取和设置实例变量@top_rows
创建了额外且可能相互冲突的实例方法,并且不会触及ActiveRecord属性。
至于为什么它在视图中不起作用,我会检查您是否已在模型中添加:ad_rows
到attr_accessible
。这允许ActiveRecord在批处理操作中更改列(要更改多个属性)。 Documentation
答案 1 :(得分:0)
似乎由于属性:ad_rows未在参数中传递,因此控制器未将其识别为已更改。
我不得不补充道:
object.ad_rows_will_change!
到我的控制器强制它保存ad_rows列。
我不确定这是否是最好的解决方案,但它现在正在运作。