Rails:Current_user应该只能看到他/她自己组中的记录。我该怎么做呢?

时间:2011-09-14 09:45:58

标签: ruby-on-rails devise associations

如何构建我的Rails 3.x应用程序,以便登录用户只能看到与他所属的组相关联的记录?

例如, (足球主题)

想象一下这些模型:

一个团队模型,代表30个职业橄榄球队中的每一个。

用户模型,使用设计进行身份验证。每个用户都有一个team_id关联。

一个玩家模型,代表NFL中的每个玩家:name:string,team_id:integer。

每个用户都是主教练,并且应该只能在球员#index中看到自己的球员。 Rails知道这一点,因为主教练(用户)有一个与他相关的team_id,球员也是如此。

现在,只有两个控制器(Team,Player),手动重新键入索引和CRUD方法似乎相当容易,只显示current_user的相关记录。

def index
  @players = Player.where(current_user.team_id = ?, 'player.team_id')
end

但想象你有6-10个控制器: 门票, 贸易, 雇员, 合同, 等等..... (都有team_id协会)

Rails是否有全局方式只显示与current_user团队相关的记录? 并且...... Rails如何阻止用户在URL中输入随机ID以查找与他的team_id无关的记录。 (想象一下,一名红皮队教练输入http://www.thesite.com/players/224/edit)并能够编辑一名名为player_id = 224的牛仔队球员。

感谢。

3 个答案:

答案 0 :(得分:2)

如果所有模型都具有team_id属性,则需要在Application Controller中按以下行定义before过滤器:

def identify_team
  @team = current_user.team
end

在每个其他控制器中,您应该通过引用团队变量来确定查询范围,例如

def index
  @players = @team.players.all
end

理论上你可以通过控制器中的current_user(current_user.team.players.all)进行范围调整,但这不是最佳实践。

此致

罗宾

答案 1 :(得分:0)

您可以使用关联。具有用户关系的每个表都可以在rails中具有模型关联。

通过关系current_user.players等你可以获得。

答案 2 :(得分:0)

试着看看以下railscasts,ryan bates在解释这些内容方面表现出色。还可以结帐teachmetocode网站。所有这些链接将为您提供关联基础以及如何在不同模型之间设置数据库关联,以便您可以实现所需。这些链接应该让你开始:

Self-Referential Association

Polymorphic Association

Two Many-to-Many

HABTM Checkboxes

Embedded Association

ActiveRecord::Relation Walkthrough

Active Record Queries in Rails 3

Many to Many Associations in Ruby on Rails – A Teach Me To Code Tutorial