例如现有的代码如下:
class Product < ActiveRecord::Base
attr_accessible :name
end
然后在很多的 views 中都使用了 product.name,某个时间,要对 name 进行统一的格式化,方案如下: 1.在 Product 中做一个额外的方法 2.在 helper 中做一个额外的方法 等等,但是 views 中的改动量都是巨大,非常别扭,有没有办法直接 hack Product 的 name 方法?
@chenge 提醒了我,最终可以通过这种方式来:
class Product < ActiveRecord::Base
attr_accessible :name
def name
undef name
# the code for format name
end
end
ps:这个方案会有问题,这个逻辑只会生效一次
最终我的办法如下谢谢 @chenge @leomayleomay :
class Product < ActiveRecord::Base
attr_accessible :name
def name
undef name
self.name = # the code for format name
end
end
这个方案会有问题,第一次是正确的,刷新页面后则无效果了,原因是在于我 undef 了 name 方法,所以还在找寻更好的方案中
如果是 rails 的话 product model 加入
def name
self[:name]
end
def name_with_option(option=false)
if option
#your code here
"with option #{name_without_option}" #demo
else
name_without_option
end
end
alias_method_chain :name, :option
class Product
# overwrite the product#name method
def name
read_attribute(:name)
end
end
奥,没留意楼主没用 ORM,那直接 2 楼行了
@fredwu draper 我试用了一下,对于代码侵入太多,导致分页,has_many 等关系什么的都需要重新配置,而且 controller 中也需要相应写很多 hack 代码,所以这个方案显得有点重了
ps: draper 蛮强大的一个 gem
@robot_zhang 用attr_accessor :name
, 会有成员变量@name
class Product
# overwrite the product#name method
def name
@name.foobarbaz
end
end