作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
每个用户都有很多角色;要查明用户是否具有“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/
我最近使用discord.py制作了一个discord机器人。我尝试为某些命令授予权限。我有这个测试命令功能: @client.command() @commands.has_role('Modera
每个用户都有很多角色;要查明用户是否具有“admin”角色,我们可以使用 has_role? 方法: some_user.has_role?('admin') 定义如下: def has_role?(
我是一名优秀的程序员,十分优秀!