在控制器RoR中仅执行一次操作

时间:2014-04-29 15:42:12

标签: ruby-on-rails ruby ruby-on-rails-3.2

我一直在学习RoR,而且我发现自己想知道如何让用户能够“滚动”#34;一次(基本上 - 一次访问控制器中的动作)。让我解释一下。

人们加入一个池,一个数组由池中的user_ids组成。 "辊"从池中随机选择一个用户ID,然后显示与该user_id关联的用户的名称。

我想确保用户已保存,并且他们无法点击浏览器上的后退箭头并且"滚动"再次。

我已经看到了一些"禁用"通过javascript链接,但我不认为这是我正在寻找的解决方案。我更倾向于拥有原始user_id的更安全的服务器端存储。

实现这一目标的方法是什么?我会发布我的代码。 这是带有show动作和滚动的控制器。

def show
  @pool = Pool.find_by_id(params[:id])   
  @games = Game.where(params[:pool_id])    
end

def roll
  @pool = Pool.find_by_id(params[:id]) 
  @entrants = []
  games = @pool.games
  ids = games.each do |game|
    @entrants << game.user_id
  end
  @loserwiner = @entrants.sample
  puts @loserwiner
end

以下是我从视图中访问滚动的方法。

<%= link_to "Roll", {:controller => 'pools', :action => "roll"}%> 

我假设我可以使用某些条件逻辑来确定是否已访问该操作......但我不知道如何...

感谢帮帮!非常感谢。

1 个答案:

答案 0 :(得分:1)

每当有人加入游泳池时,你想要展示一个失败者?其他用户是否也应该看到这个失败者,还是每个玩家?

您可以将信息存储在会话中:

session[@pool.id] = @loserwiner

因此,您只需检查行动开始时session[@pool.id]是否存在。

或者,如果您想要保留此信息,可以在userpool之间创建一个连接表,其中包含存储失败者的列。然后,很容易检查用户是否已经为此池进行了滚动。


详细信息:

而不是:

@entrants = []
games = @pool.games
ids = games.each do |game|
  @entrants << game.user_id
end

你可以写

@entrants = @pool.games.pluck(:user_id)

而不是

<%= link_to "Roll", {:controller => 'pools', :action => "roll"}%>

您可能想要使用指定路线

<%= link_to "Roll", roll_pool_path(pool) %>