2013-04-17 61 views
0

我有以下表格:用戶,員工,聯繫人。員工和聯繫人belongs_to用戶和用戶has_one聯繫人或has_one員工。當創建新的聯繫人或員工時,我有他們的模型創建一個新的用戶。Rails - 我想允許用戶只更改其配置文件

我希望聯繫人(最終用戶)能夠編輯他們自己的聯繫人記錄。所以,我有以下的鏈接:

<li><%= link_to "Edit Profile", edit_contact_path(current_user.contact) %></li> 

這將調出他們的記錄,他們可以編輯它。但是,我不希望他們能夠通過其他contacts.id重新輸入網址並編輯他們的記錄。

我嘗試以下,但它並不能阻止他們:

<% if current_user.contact = @contact %> 
<%= render 'form' %> 
<% end %> 

僅供參考 - 我還允許管理員的人與此代碼編輯聯繫人記錄:

<% if current_user.admin? %> 
    <%= render 'form' %> 
<% end %> 

要解釋進一步 - 網址如下所示:

http://localhost:5000/contacts/4/edit 

而且如果你用6代替4,它仍然會提示那個記錄器d。

感謝您的幫助!

+0

我真的希望你的意思是'如果current_user.contact == @ contact',比較,而不是賦值。 – MBO

+0

您可以使用帶有自定義驗證方法的'before_filter',該方法在任何聯繫人編輯頁面之前被調用。這樣,如果用戶嘗試更改網址,自定義驗證方法仍會被調用。在自定義方法中,你可以檢查'current_user == @ contact'。如果是這樣,請顯示編輯表單,否則重定向回來並顯示錯誤消息。 – Huy

回答

2

首先,我想你可能會錯過=的標誌。

<% if current_user.contact == @contact %> 
<%= render 'form' %> 
<% end %> 

其次,contacts#edit行動做類似

if current_user.contact != @contact 
    flash[:error] = "you've been naughty" 
# also its recommended to record such an abuse attempt by logging or something 
else 
# do rest here 
end 

您還可以做更多的東西,如cancan或其他授權寶石(例如,如果你想只允許特定用戶編輯聯繫並不只是current_user)。

+0

感謝您的幫助! – Reddirt