0

我受的傳入和傳出我的Rails參數和結果處理混淆視圖助手:爲什麼Rails視圖助手邏輯在一個實例中失敗,但在另一個實例中運行?

module CasesHelper 
    def case_owned(owner,cur_usr)  
     return false if (owner.nil?) 
     return false if (cur_usr.nil?) 
     x = User.find(cur_usr) 
     y = User.find(owner) 

     ## this does not returns 'true' 
     ## when expected 
     ## return true if (owner == cur_usr) 

     return true if (x == y)  #<<<< This line works 
     return false 
    end 
end 

這是視圖代碼:

<td><%= link_to 'Show', c %></td> 
    <td><%= (link_to 'Edit', edit_case_path(c)) if case_owned(c.user_id,current_user) %></td> 
    <td><%= (link_to 'Destroy', c, method: :delete, data: { confirm: 'Are you sure?' }) if case_owned(c.user_id,current_user) %></td> 

如何運行的代碼工作和評論 - 不行嗎?爲什麼需要User.find()調用來確保相等。而且,怎能:

User.find(cur_usr) == User.find(owner) 

...評估爲true

時:

cur_usr == owner 

...評估爲false

我現在用的是制定創業板的認證和它提供了current_user方法。我最初使用「cur_usr == owner」行編碼上面的代碼,但使用User.find()方法實現了。我感到困惑的是,傳遞給find()的參數如何被認爲是不相等的,但返回的對象(記錄)被評估爲相等。我在這裏錯過了什麼?

請嘗試引導您的意見,以便如何將Ruby作爲參數處理傳遞對象或Rails命名約定如何「幫助」這裏。我提前感謝!

回答

1

current_user通常會返回User實例,如果通過運行User.find(cur_user)(它返回相同的用戶),它將正常工作。但是,您的第一個參數是一個id(視圖中的c.user_id)。你可以做owner == cur_user.id

如果您始終希望在方法中使用ID,則應該命名變量owner_id

+0

我嘗試使用case.user_id和current_user_id的調用參數,但是current_user_id拋出一個錯誤。然後我嘗試了current_user.id作爲調用參數,但是也拋出了一個錯誤。我很明白如何將User和User_id的實例傳遞給User.find()可以返回相同的結果。感謝您指出case_owned收到的對象類型中的重要區別。 –

+0

是的。 Owner_id會更好。我只是嘗試「返回true,如果(所有者== cur_usr.id)」,它工作正常。謝謝!比每次執行兩個表查詢要快得多。仍然不確定爲什麼current_user.id不能用作視圖內的調用參數。 –

相關問題