0

我在这里做了一些搜索,但我找不到任何能完全回答我正在寻找的东西的东西。如果我搜索失败,我深表歉意。

继续前进,我是 Rails 的新手,如果你愿意的话,我正在开发一个测试水域的应用程序。我正在使用 Devise 进行身份验证,事实证明它非常有用。就是说,我遇到了一个很大的障碍,即特定的数据检查将去哪里,以及我将如何去做。

我有三个表:usersgamesusers_games(我读​​到这是关系表的可接受命名约定,如果我错了,请纠正我)。users_games如果当前登录的用户将此游戏添加到他们的帐户(在)中,我想在游戏页面上显示特定消息。我不确定在哪里执行此检查,或者它是否重要。

至于实际检查,我最初的想法是:

游戏控制器.rb

class GamesController < ApplicationController
  def index
    @games = Game.all
  end

  def show
    @game = Game.find(params[:id])
    @user_owns = UsersGames.where(:game_id => @game.id, :user_id => current_user.id)
  end
end

然后在视图上检查是否@user_owns有值。

提前感谢您提供的任何见解或智慧。

4

2 回答 2

0

这种方式呢,如果游戏 has_many users 和 user belongs_to game 可能你不需要 users_games

  def show
    @game = Game.find_by_user_id(current_user.id)
  end

然后在视图上检查@game 是否有值。

于 2012-07-17T06:16:19.037 回答
0

如果您的Users<->Games关系是一个简单的 HABTM,连接表上没有其他属性,即

class User < AR::Base
  has_and_belongs_to_many :games

class Game < AR::Base
  has_and_belongs_to_many :users

您不需要为连接表创建单独的模型,前提是您遵循 Rails 命名约定,该约定要求您在命名连接表时遵循字典顺序,即在您的情况下,它会是games_users,而不是相反就像你现在拥有它一样。

回到你原来的问题,我认为它可以像这样简单:

def show
  @game = Game.find(params[:id])
  @game_owned = current_user.games.include? @game
end

您还可以在您的用户模型上将此方法设为:

class User < AR::Base
  ...
  def owns_game?(game)
    self.games.include?(game)
  end
end

然后调用current_user.owns_game?(@game)你的控制器/视图。

于 2012-07-17T06:27:37.997 回答