我已设置@user_ctypes,但是,当我从模型访问它时,我得到 Nil 值。为什么呢?
这是电视指南,用户(current_user)将设置要隐藏的频道。 例如: 如果登录的用户没有卫星,他将拥有ctypes = ['sat']。因此,任何在卫星上播出的频道都将隐藏给用户。 如果未记录用户,则current_user为nil。
我想使用“default_scope”,因为对DB的任何查询都应该关注用户想要查看的频道。
的ApplicationController
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
before_filter :set_user_ctypes
private
def set_user_ctypes
unless current_user.nil?
@user_ctypes = current_user.ctypes
else
@user_ctypes = Array.new
end
end
模型
class Channel < ActiveRecord::Base
has_many :programs, :dependent => :delete_all
validates :name, :site, :ctype, :country, :presence => true
default_scope {where.not(ctype: @user_ctypes)}
用户(由Devise提供)
class User < ActiveRecord::Base
答案 0 :(得分:5)
控制器(本例中为ApplicationController
)和模型(本例中为Channel
)是不同对象的不同实例,因此不共享实例变量,因此无法使用模型中的实例变量。
通常,要将变量传入范围,通常会执行以下操作:
scope :name lambda{|user_ctypes| { where.not(ctype: user_ctypes) }
这是问题所在,这是一个默认范围,因此您无法真正共享在控制器中创建的实例变量,因为否则它有点像全局变量。
考虑一下这个位,看看是否有更好的方法,我总是发现Rails,如果很难做到/不可行,那可能是错的。也许您可以考虑使用正常范围或将逻辑移到别处。
答案 1 :(得分:-3)
发生这种情况是因为您已将private
方法放在已声明为@user_ctypes
变量