2012-02-26 99 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