Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails-设置对象值_Ruby On Rails_Authentication - Fatal编程技术网

Ruby on rails RubyonRails-设置对象值

Ruby on rails RubyonRails-设置对象值,ruby-on-rails,authentication,Ruby On Rails,Authentication,我创建了一个RubyonRails应用程序,用户可以在其中登录和注销,还可以创建新帐户。用户有一个整数“rankid”,根据他们的rankid在站点上有不同的权限 我希望用户能够通过转到ROOTURL/upgrade,升级到下一个排名-因此在my routes.rb中,我有以下内容: map.connect '/upgrade', :controller => 'users', :action => 'upgrade' 在“我的用户”控制器中使用以下方法: def upgrade

我创建了一个RubyonRails应用程序,用户可以在其中登录和注销,还可以创建新帐户。用户有一个整数“rankid”,根据他们的rankid在站点上有不同的权限

我希望用户能够通过转到
ROOTURL/upgrade
,升级到下一个排名-因此在my routes.rb中,我有以下内容:

map.connect '/upgrade', :controller => 'users', :action => 'upgrade'
在“我的用户”控制器中使用以下方法:

def upgrade
  @CurrentID = session[:user_id]
  @user = User.find(@CurrentID)

  if @user.rankid = 0
    @user.rankid = 1
    redirect_to root_url, :notice => "Upgraded to VIP!"
    return
  end
  if @user.rankid = 1
    @user.rankid = 2
    redirect_to root_url, :notice => "Upgraded to Admin!"
    return
  end
end
我使用设置了身份验证,但不明白为什么它不起作用。
抱歉,如果这是一个非常愚蠢的错误-我对Ruby和Rails都是新手。

首先,您的
if
语句需要一个双等号,它将
@user.rankid
0
进行比较,而不是将其设置为
0

if @user.rankid == 0
其次,在更新用户之后,您永远不会保存他们。最后,在第二个块上使用
elsif
。否则,用户将升级为VIP,然后立即升级为管理员。通过使用else/elsif,您不需要硬编码return语句

完整代码:

def upgrade
  @user = User.find(session[:user_id])
  if @user.rankid == 0
    @user.update_attributes(:rankid => 1)
    redirect_to root_url, :notice => "Upgraded to VIP!")
  elsif @user.rankid == 1
    @user.update_attributes(:rankid => 2)
    redirect_to root_url, :notice => "Upgraded to Admin!"
  end
end

首先,您的
if
语句需要一个双等号,它将
@user.rankid
0
进行比较,而不是将其设置为
0

if @user.rankid == 0
其次,在更新用户之后,您永远不会保存他们。最后,在第二个块上使用
elsif
。否则,用户将升级为VIP,然后立即升级为管理员。通过使用else/elsif,您不需要硬编码return语句

完整代码:

def upgrade
  @user = User.find(session[:user_id])
  if @user.rankid == 0
    @user.update_attributes(:rankid => 1)
    redirect_to root_url, :notice => "Upgraded to VIP!")
  elsif @user.rankid == 1
    @user.update_attributes(:rankid => 2)
    redirect_to root_url, :notice => "Upgraded to Admin!"
  end
end

您是否在用户点击用户升级操作(即登录)之前设置会话[:user_id]

您也可以跳过额外的变量,只使用

@user = User.find(session[:user_id])
但是在你使用结果之前,确保你得到了有用的东西

if @user
   @user.rankid += 1;
   @user.save # Maybe even error check this
   case @user.rankid
   when 1
     notice = "Upgraded to VIP!"
   when 2
     notice = "Upgraded to Admin!"
   else
     notice = "r00t!"
   end
   redirect_to root_url, :notice => notice
   return
else 
   # some problem with your user or missing session[:user_id]
end

您是否在用户点击用户升级操作(即登录)之前设置会话[:user_id]

您也可以跳过额外的变量,只使用

@user = User.find(session[:user_id])
但是在你使用结果之前,确保你得到了有用的东西

if @user
   @user.rankid += 1;
   @user.save # Maybe even error check this
   case @user.rankid
   when 1
     notice = "Upgraded to VIP!"
   when 2
     notice = "Upgraded to Admin!"
   else
     notice = "r00t!"
   end
   redirect_to root_url, :notice => notice
   return
else 
   # some problem with your user or missing session[:user_id]
end

没有愚蠢的错误。只是学习,没有愚蠢的错误。只是学习。啊,好的,谢谢!出于某种原因,我认为“=”是Ruby中的比较运算符(在if语句中使用时它改变了操作)。啊,好的,谢谢!出于某种原因,我认为“=”是Ruby中的比较运算符(在if语句中使用时它改变了操作)。