【问题标题】:method_missing and association_proxy in railsrails 中的 method_missing 和 association_proxy
【发布时间】:2011-05-17 21:46:52
【问题描述】:

所以,这是我的问题。我目前正在为 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 方法。如果您需要更多信息或代码 sn-ps,请告诉我。

我在 Ruby 1.9 上使用 Rails 3

【问题讨论】:

  • @user 是如何设置的?前过滤器之前有过滤器吗?
  • 是的,@user 设置在 application_controller 的 before_filter 中,而不是在 reports_controller 中调用 @user.is_an_admin?。我还在该控制器的 index 方法中尝试了@user.is_an_admin? 以进行调试,并收到相同的错误。

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


【解决方案1】:

对于这样的任务,我会考虑一个 method_missing 的过度杀伤力。

现在,如果你有 Session 类,它属于 User,那么你可以拥有这个:


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

附:检查cancan,也许它会更好地满足您的需求。

【讨论】:

  • 这可能适合我的即时需求,但我想将其构建为可扩展的。我希望以后能够添加更多用户角色,而不必编写“is_a_role?”每个方法。我去看看cancan,谢谢。
  • 你可以在这个 mixin 中使用 method_missing,我只是不喜欢这个概念。
【解决方案2】:

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

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

这也可能对你有用。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多