0

所以我实现了一个会话系统,但是我遇到了一些麻烦。
首先,当我创建一个新的 pokemon 时,我使用这段代码将 session[:user_id] 链接到它。

@pokemon = Pokemon.new(params[:pokemon])
@pokemon.user_id = @current_user 

当我用我的帐户 1 创建一个口袋妖怪时,user_id 是 1,但是当我用我的帐户 2 创建一个口袋妖怪时,user_id 再次设置为 1。

另外,我怎样才能保护编辑/显示/销毁页面只到会话?现在,如果我直接使用地址栏,我可以使用任何帐户编辑任何口袋妖怪。

我把我的控制器放在一个要点中(我想这一切都发生在他们身上)

提前致谢。

4

1 回答 1

1

也许这不是一个答案,但太长了,不能发表评论。

首先,我不确定是否@pokemon.user_id可以设置为用户实例,我会尝试:

@pokemon.user = current_user

或者:

@pokemon.user_id = current_user.id

其次,我不会 user @current_user,而是current_user如上所述。

第三,不清楚你在哪里设置session[:user_id],为了调试你的问题,我会在口袋妖怪控制器的创建动作中打印所有相关变量:

  def create
    @pokemon = Pokemon.new(params[:pokemon])
    @pokemon.user_id = current_user 
    p current_user
    p session[:user_id]

安全操作

您可以使用以下方式限定您的资源current_user

@pokemon = current_user.pokemons.find(params[:id])

这样,您将只找到该用户的口袋妖怪。我不确定此方法是否引发异常或仅nil在用户尚未创建 pokemon 时返回params[:id]。您必须处理这两个中的任何一个(异常或 nil)才能将其他用户重定向到另一个页面:

例外

begin
@pokemon = current_user.pokemons.find(params[:id])
rescue ActiveRecord::RecordNotFound => e
  redirect_to :back
end

为零

@pokemon = current_user.pokemons.find(params[:id])
unless @pokemon
  redirect_to :back
end
于 2013-07-28T00:17:03.607 回答