@Variables来自Application Controller的rails

时间:2013-12-04 22:21:28

标签: ruby-on-rails ruby ruby-on-rails-4

我已设置@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

2 个答案:

答案 0 :(得分:5)

控制器(本例中为ApplicationController)和模型(本例中为Channel)是不同对象的不同实例,因此不共享实例变量,因此无法使用模型中的实例变量。

通常,要将变量传入范围,通常会执行以下操作:

scope :name lambda{|user_ctypes| { where.not(ctype: user_ctypes) }

这是问题所在,这是一个默认范围,因此您无法真正共享在控制器中创建的实例变量,因为否则它有点像全局变量。

考虑一下这个位,看看是否有更好的方法,我总是发现Rails,如果很难做到/不可行,那可能是错的。也许您可以考虑使用正常范围或将逻辑移到别处。

答案 1 :(得分:-3)

发生这种情况是因为您已将private方法放在已声明为@user_ctypes变量

的方法中