2012-02-26 75 views
0

我在理解“参数”函数中遇到了一些麻烦。类型转换参数散列值

我们假设我有用户模型。 用户控制器中的下一个代码描述符,它的功能是处理POST'destroy'请求。 “current_user”函​​数返回当前登录的用户(我建议用户类的一个实例)。通过比较“CURRENT_USER == PARAMS [:ID]”“摧毁”功能检查,如果用户试图删除自己

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#编程经验,所以我推测这种比较应该会导致一些类型转换。在这种情况下,我认为这将是User obj ---> string obj(OR string - > User ??? !!!!)。 虽然我有很多关于Rails如何管理比较用户类和字符串类的问题,但我可以让自己适应这一点。

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

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

谢谢!

+1

你能后的'current_user'方法的代码?我不希望'current_user == params [:id]'返回true,所以我很惊讶这个代码适合你。 – Brandan 2012-02-26 04:08:15

+0

很难说出发生了什么,因为我不知道'current_user'或'params'的值是什么。你可能想用'Rails.logger.debug(“params:#{params.inspect}”)''来检查它们。可能会出现一些魔法(比如说一个对象等于它自己或者它的ID),但是我不希望一个'User'与一个整数相比,返回'true'。 – brymck 2012-02-26 04:39:34

回答

0

首先:找个体面的红宝石书并阅读它的动态类型系统和方法执行。当你来自像c这样的语言时,它应该回答你的大部分问题。

像c中的操作符重载它可能在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 
+0

谢谢你的建议!我已经尝试过这种方法 - 它的工作原理。但我的兴趣没有多大改善。我不想比较用户对象,因为我认为它经历了全面的属性比较,但比较本地简单类型 – 2012-02-27 12:19:13

+0

在ruby中没有像本地简单类型那样的东西。它都是对象,你需要知道'=='在做什么。然而,与你正在做的事情相比,'current_user == user'是很好的代码风格。 – phoet 2012-02-27 13:06:36

+0

谢谢你,我明白了!无论如何,我想纠正自己:在这里,术语“本地”是主动的,我的意思是SIMPLE类型。我的英语还很差。 – 2012-02-28 06:57:15

0

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

0

你应该这样做

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

PARAMS [:ID]是一个字符串,你应该把它与CURRENT_USER的ID进行比较,而不是CURRENT_USER

相关问题