gpt4 book ai didi

ruby-on-rails - 很难将 `is_x?` 别名化为 `has_role? x`

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

每个用户都有很多角色;要查明用户是否具有“admin”角色,我们可以使用 has_role? 方法:

some_user.has_role?('admin')

定义如下:

def has_role?(role_in_question)
roles.map(&:name).include?(role_in_question.to_s)
end

我希望能够将 some_user.has_role?('admin') 写成 some_user.is_admin?,所以我做到了:

  def method_missing(method, *args)
if method.to_s.match(/^is_(\w+)[?]$/)
has_role? $1
else
super
end
end

这适用于 some_user.is_admin? 情况,但当我尝试对另一个关联中引用的用户调用它时失败:

>> Annotation.first.created_by.is_admin?
NoMethodError: undefined method `is_admin?' for "KKadue":User
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/associations/association_proxy.rb:215:in `method_missing'
from (irb):345
from :0

什么给了?

最佳答案

Rails 检查您是否 respond_to? “is_admin?” 在执行 send 之前。

所以你需要专门化 respond_to? 也像:

def respond_to?(method, include_private=false)
super || method.to_s.match(/^is_(\w+)[?]$/)
end

注意:不要问我为什么 rails 检查respond_to? 而不是仅仅执行发送在那里,我看不出什么好的理由。

另外:最好的方法(Ruby 1.9.2+)是定义respond_to_missing?相反,您可以通过一些花哨的东西与所有版本兼容,例如:

def respond_to_missing?(method, include_private=false)
method.to_s.match(/^is_(\w+)[?]$/)
end

unless 42.respond_to?(:respond_to_missing?) # needed for Ruby before 1.9.2:
def respond_to?(method, include_private=false)
super || respond_to_missing?(method, include_private)
end
end

关于ruby-on-rails - 很难将 `is_x?` 别名化为 `has_role? x`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3302690/

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