Ruby on rails 基于当前\u用户动态设置命名\u范围
我不断得到以下错误: 你有一个零对象,而你没有 期待吧!你可能会想到 数组的实例。发生了错误 在评估零尺寸时 根据当前用户,当他们导航到某个页面时,我想根据他们的站点将他们的浏览范围限制在所能看到的范围内。问题是站点和用户表之间并没有直接的关联。联系人只有一个用户(用户信息存储在当前用户变量中)。一个网站有很多联系人。一个站点有很多学生,其中学生表有一个外键site\u id。因此学生和站点之间有一个链接,所以当当前用户导航到学生页面时,他们只能看到来自同一站点的学生。我可以通过在命名的\u范围中硬编码一个数字来实现这一点,只显示当前\u用户站点的学生。但是不同的用户将属于不同的站点,因此当登录时,与他们关联的站点将发生变化。这就是问题所在-在命名的\u范围中动态设置该值。这就是我所拥有的: 学生控制员Ruby on rails 基于当前\u用户动态设置命名\u范围,ruby-on-rails,dynamic,model,controller,named-scope,Ruby On Rails,Dynamic,Model,Controller,Named Scope,我不断得到以下错误: 你有一个零对象,而你没有 期待吧!你可能会想到 数组的实例。发生了错误 在评估零尺寸时 根据当前用户,当他们导航到某个页面时,我想根据他们的站点将他们的浏览范围限制在所能看到的范围内。问题是站点和用户表之间并没有直接的关联。联系人只有一个用户(用户信息存储在当前用户变量中)。一个网站有很多联系人。一个站点有很多学生,其中学生表有一个外键site\u id。因此学生和站点之间有一个链接,所以当当前用户导航到学生页面时,他们只能看到来自同一站点的学生。我可以通过在命名的\u范围
def index_scoper
if current_user.role_id == 8
super.site_staff_limit while current_user[:site_id]
# The problem is the user table has no site_id. There is no direct
# link between the users table and sites table. However, there is
# a link between users and contacts and then site and contacts and
# then site and students, where students table has site_id.
else
super.with_state.with_site
end
end
学生模型
named_scope :site_staff_limit, lambda {|site_id| {:conditions => {:site_id => site_id}}}
谢谢你的建议
表之间的关系:
用户:联系电话号码
联系人:主键、可联系\u id、可联系\u类型
站点:主键
学生:站点id
用户模型
属于:联系人
接触模型
有一个:用户
属于:可接触,:多态=>true,:依赖=>:destroy
场地模型
有多个:联系人,:as=>:可联系
你有很多学生吗
学生模型
属于:站点
这成功地通过站点限制了学生:
学生控制员
def索引示波器
如果当前_user.role_id==8
super.site\u人员\u限制
其他的
super.with_state.with_site
结束
结束
学生模型
命名的\u范围:site\u staff\u limit,:conditions=>{:site\u id=>1}
问题是不同的用户将属于不同的站点,因此他们只能访问他们所属站点的学生记录。我很难使上面的命名范围动态到足以实现这一点。您可能能够在用户和站点之间建立一个链接,并建立一个:通过关系 您提供的代码有效吗?
是否发生了错误?您是否有可能将代码的格式设置得更好一些?谢谢。我已经尝试了几十种解决方案,从许多不同的错误。例如,我尝试创建三个命名的\u作用域,然后在controller:super.current\u user(:contact\u id)。contacts(:contactable\u id,:contactable\u type)。site\u staff\u limit(:site\u id)中引用它们,但这会导致无关联错误。请稍候。。。看起来您正试图使用“super”调用控制器上的作用域?是super包含学员信息。它继承自在lib目录中创建的restfulcontroller中的一个方法,学生控制器从该方法继承。所以super是指学生模型。那么您的模型是从控制器继承的吗?StudentsController是从Restful控制器继承关键字super。然后我将命名的_范围应用到super上,以限制结果。超级包含所有记录。我想通过当前用户的站点id进行限制。