类型转换为params散列值

时间:2012-02-26 03:42:36

标签: ruby-on-rails ruby return-value params

我在理解RoR中的“params”功能时遇到了一些麻烦。

让我们假设我有用户模型。 用户控制器中的下一个代码表示,它的功能是处理POST'destroy'请求。 “current_user”函​​数返回当前已登录的用户(我建议的User类的实例)。通过比较“current_user == params [:id]”'destroy'函数检查用户是否试图删除自己

def destroy

    if current_user == params[:id]
        flash[:error] = "you cannot delete yourself!"
    else
        User.find(params[:id]).destroy
        flash[:success] = "user deleted"
    end

    redirect_to(users_path)
end

所以问题是块代码运行良好。我真的不明白为什么。我的背景是在大学里3年的C ++ / C#编程经验,所以我认为这种比较应该导致一些类型转换。在那种情况下,我认为这将是用户obj ---> string obj(OR string - > User ??? !!!!)。 虽然我对Rails如何设法比较User类和字符串类有很多疑问,但我可以对此感到满意。

但是如果我想优化这个任务并明确比较ID:存储在params [:id]中的那个作为字符串(??),另一个存储在current_user [“id”]散列中。

首先是字符串类型,第二个是整数,我错了吗?因为“current_user [”id“] == params [:id] .to_i”导致错误,这意味着params [:id]返回User类的实例o_O

谢谢!

3 个答案:

答案 0 :(得分:0)

您的current_user变量应包含整数或字符串格式的id。或者,您的用户模型可能已为用户实例定义了to_s方法。在这种情况下,当尝试将对象转换为字符串(用于与字符串进行比较)时,将调用此方法,该方法将以字符串格式返回id。 您应该打印current_user变量以及params [:id]以确保。

答案 1 :(得分:0)

你应该这样做

if current_user.id.to_s == params[:id]

params [:id]是一个字符串,您应该将它与current_user的id进行比较,而不是current_user

答案 2 :(得分:0)

首先:给自己一本不错的红宝石书并阅读它的动态类型系统和方法执行。当你来自c。等语言时,你应该回答大部分问题。

就像op中的opperator重载一样,在ruby中可以为==之类的东西实现自定义行为。这在ruby中非常容易,因为==只是一种方法。这就是你可以为多种类别编写比较的方法,即使它们不再是对称的。

在您的情况下,您提供的代码是错误的。将current_userparams['id']进行比较将始终产生错误。

你应该这样写:

user = User.find params[:id]
if current_user == user
  redirect_to users_path, :error => "you cannot delete yourself!"
else
  user.destroy
  redirect_to users_path, :notice => "user deleted"
end