在我的rails模型中,我有一个名为employer_wcb的小数属性.如果在更改employer_wcb时将脏位设置为true,我希望如此.我想覆盖employer_wcb setter方法.有没有办法(特别是使用元编程)?
我试图在我的模型中的一个属性中动态创建方法链.到现在为止我有这个功能:
def create_filtered_attribute(attribute_name)
alias_attribute "#{attribute_name}_without_filter", attribute_name
define_method "#{attribute_name}" do
filter_words(self.send("#{attribute_name}_without_filter"))
end
end
Run Code Online (Sandbox Code Playgroud)
所以我收到一个带有属性名称的字符串,别名为' _without_filter '(alias_method或alias_method_chain在这里失败,因为在创建类时属性不存在),我创建了一个带有属性名称的新方法,我在其中过滤了内容.
但不知何故,当我调用"#{attribute_name} _without_filter"时,它调用我的新方法(我认为因为alias_attribute有些如何),程序进入堆栈循环.
我试图重命名该属性,所以我可以使用它的名称作为方法...
有人可以请教我这个.
我有一个我正在研究的模块.我正在设置一些这样的属性:
$self->{FOO};
$self->{BAR};
$self->{FOOBAR};
Run Code Online (Sandbox Code Playgroud)
而且,我想使用AUTOLOAD来帮助创建访问这些属性的方法.例如,$foo->Bar()返回值$self->{BAR}.没问题.一切都是标准的.
现在,我想创建别名方法.例如,如果有人说$obj->Fu();,我会回来$self->{FOO}.我想做的是创建一个$self->{FU}指向相同内存位置的内容$self->{FOO}.这样,当我设置值时$self->{FOO},$self-{FU}也会设置.这样,我不必对AUTOLOAD的工作方式进行各种更改,也不必在设置$self->{FU}时记住设置$self->{FOO}.
这样做有简单的方法吗?
当我启动应用程序崩溃后出现错误
/home/stereodenis/.rvm/gems/ruby-1.9.3-p194@nyanya/gems/haml-3.1.6/lib/haml/helpers/action_view_mods.rb:15:in `alias_method': undefined method `render' for class `ActionView::Base' (NameError)
Run Code Online (Sandbox Code Playgroud)
可能有什么不对?
to_s我不想覆盖我的模型,而是将其别名为现有的方法full_name.
双方alias并alias_method似乎并不如预期的工作.
aliasclass Person < ActiveRecord::Base
# ... other model code.
alias to_s full_name
def full_name
"#{first_name} #{last_name}"
end
end
# In Terminal
> Person.last.to_s #=> "#<Person:0x007fa5f8a81b50>"
Run Code Online (Sandbox Code Playgroud)
alias_methodclass Person < ActiveRecord::Base
# ... other model code.
alias_method :to_s, :full_name
def full_name
"#{first_name} #{last_name}"
end
end
# In Terminal
> Person.last.to_s #=> "#<Person:0x007fa5f8a81b50>"
Run Code Online (Sandbox Code Playgroud) 我浏览了一下,没有看到答案:
您会使用别名方法做什么?
class Vampire
attr_reader :name, :thirsty
alias_method :thirsty?, :thirsty
end
Run Code Online (Sandbox Code Playgroud)
我使用问号的唯一原因是能够在我定义的任何方法中使用问号吗?我相信您不能对实例变量使用问号。