gpt4 book ai didi

ruby-on-rails - 如何覆盖模块中的 attr_accessor getter?

转载 作者:数据小太阳 更新时间:2023-10-29 07:48:13 24 4
gpt4 key购买 nike

module HasUrl
extend ActiveSupport::Concern

included do
attr_accessor :bar
end

def bar
0
end
end

class Foo < ActiveRecord::Base
include HasUrl
end

bar 属性不存储在数据库中,但在表单中使用(使用 SimpleForm 的 f.input)。我想覆盖此方法的 getter,以便我可以根据其他属性设置 bar 并让表单正确地预填充值。

问题是在这样的包含 block 中使用 attr_accessor 会在 Foo 类上设置 getter。因为该模块包含在祖先链中的 Foo 之上,所以永远不会触及返回 0 的自定义 bar 方法。

解决这个问题的一种方法是

class Foo < ActiveRecord::Base
include HasUrl

def bar
super
end
end

但我想避免这个额外的步骤。我只想包含该模块并让它“工作”。另一种选择是在我的表单中使用不同的助手(f.input_field 等),但我无法利用 SimpleForm 的包装器。

Module#prepend 也不能解决我的问题,因为 HasUrl 还定义了一些其他东西(特别是 ActiveRecord 回调)。如果我预先设置,这些回调会导致错误:

NoMethodError: undefined method `_run_...__find__...__callbacks`

有没有办法解决这个错误,以便前置可以工作?还是另一种方法来完全做到这一点?

最佳答案

您确定要使用 attr_accessor 吗? attr_writer 还不够吗?

require 'active_support/all'

module HasUrl
extend ActiveSupport::Concern

included do
attr_writer :bar
end

def bar
0
end
end

class Foo
include HasUrl
end

p Foo.new.bar

无论如何,如果你真的想使用 attr_accessor,这应该可行:

require 'active_support/all'

module HasUrl
extend ActiveSupport::Concern

included do
attr_accessor :bar
define_method :bar do
0
end
end
end

class Foo
include HasUrl
end

p Foo.new.bar

关于ruby-on-rails - 如何覆盖模块中的 attr_accessor getter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17453255/

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