rails中的method_missing和association_proxy

时间:2011-05-17 21:46:53

标签: ruby-on-rails ruby method-missing

所以,这是我的问题。我目前正在为rails网站构建一个简单的身份验证系统。我有3个类:Person,Session和Role。在我的Person模型中,我定义了method_missing来根据this guide动态捕获角色。

在我的application_controller中,我有一些处理登录和注销的逻辑,其结果通过以下方式为我提供了当前登录的用户:     @user = @application_session.person 其中@application_session是当前会话

现在在我的一个控制器中,除非他们是管理员,否则我不希望任何人能够做任何事情,所以我包括:     before_filter @user.is_an_admin?

这会引发NoMethodError,即使我的模型中定义了method_missing。我尝试定义is_an_admin?,让它总是作为测试返回true,并且有效。

根据this question,我认为问题可能与代理关联有关。当我跑:     puts @user.proxy_owner 我得到一个会话对象,因为每个用户(Person)可以有很多会话,我从当前会话中获得了我的用户(Person)。

我很困惑为什么@user.is_an_admin?没有在我的Person控制器中调用method_missing方法。如果您需要更多信息或代码段,请与我们联系。

我在Ruby 1.9上使用Rails 3

3 个答案:

答案 0 :(得分:0)

我认为method_missing对这样的任务来说太过分了。

现在,如果您有Session类,其属于User_to,那么您可以拥有:


class Session
  belongs_to :user, :extend => PermissionMixin
end

class User
  include PermissionMixin
end

module PermissionMixin
  def admin?
    if cond
      true
    else
     false
    end
  end
end

P.S。检查cancan,或许它会更好地满足您的需求。

答案 1 :(得分:0)

我已将method_missing方法移至我的application_controller.rb,从而解决了这个问题。我稍微改变了方法的逻辑以检查用户,如果找到,则动态检查角色。如果事情不是犹太人,我将方法重定向到root_url,或者如果用户匹配请求的角色,则返回true。

最后,在我的报告控制器中,我使用before_filter :is_an_admin?并得到了我想要的结果。但是,我仍然不清楚为什么必须在我的应用程序控制器中定义method_missing而不是直接在Person(aka @user)模型中定义?

答案 2 :(得分:0)

我在我的系统中使用类似的权限检查来检查用户>角色>权限关联: User.current_user.can_sysadmin?

在我的控制器中,我必须使用: User.current_user.send('can_sysadmin?')

这对你也有用。