【问题标题】:How to call controller method in model如何在模型中调用控制器方法
【发布时间】:2013-01-11 15:04:15
【问题描述】:

我有一个与组关联的用户模型。关系如下

class User < ActiveRecord:;Base
  has_many :groups
end
class Group < ActiveRecord::Base
  belongs_to :user
  scope :user_groups, lambda { where(arel_table(:user_id).eq(@current_user.id) }
end

class ApplicationController < ActionController::Base
  def current_user
    @current_user ||= User.find(session['entity.user']) if session['entity.user']
  end
end

我想在组索引页面的 select_tag 中过滤 current_user 组。

如何做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rails-activerecord


    【解决方案1】:

    您不应该在模型内部访问这些数据(它违反了 MVC)。您最好将其作为参数传递给范围:

    scope :user_groups, 
               lambda { |user| where(arel_table(:user_id).eq(user.try(:id) || user) }
    

    然后这样称呼它:

    User.user_groups(@current_user) # or you can pass @current_user.id, still works
    

    注意:您可以将 id(整数)或用户对象传递给 user_groups lambda。

    【讨论】:

    • 不要打破scope :user_groups和lambda [..]之间的界限
    【解决方案2】:

    有时您可能需要检查模型中的 current_user。所以在当前用户方法中设置如下:

     ActiveRecord::Base.current_user = @current_user
    

    这将有助于检查您将来定义的任何模型中的 current_user。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多