2013-02-25 54 views
0

我有一個簡單的rails應用程序,用戶可以在其中創建'項目',但在列出所有項目的主索引頁面上,有'顯示,編輯和刪除'鏈接。到每個'項目'。我知道這是由於我使用腳手架來完成項目,但我想確保人們只能編輯他們創建的項目。這個邏輯目前略高於我的頭腦,就像我以前所說的那樣,對於Rails來說是全新的。CRUD項目/ Microposts在Rails應用程序中的所有權

用戶控制器:

class UsersController < ApplicationController 
    def show 
    @user = User.find_by_username(params[:id]) 
    end 
    def index 
    @user = User.find(:all) 
    end 
end 

碩士項目查看:

<div class="well"> 
    <h1>All Items</h1> 
    <table> 
    <tr> 
    <th>Title</th> 
    <th>Details</th> 
    <th>Inquire</th> 
    <th></th> 
    <th></th> 
    <th></th> 
    </tr> 
<% @items.each do |item| %> 
    <tr> 
    <td><%= link_to item.title, item_path(item) %></td> 
    <td><%= item.content %></td> 
    <td><%= mail_to item.email, "Inquire", :cc => "[email protected]", 
       :subject => "OverFlow Inquiry Regarding " + item.title %></td> 
    <td><%= link_to 'Show', item %></td> 
    <td><%= link_to 'Edit', edit_item_path(item) %></td> 
    <td><%= link_to 'Destroy', item, confirm: 'Are you sure?', method: :delete %></td> 
    </tr> 
<% end %> 
    </table> 

<br /> 
<%= link_to 'New Item', new_item_path %> 
</div> 

產品型號:

class Item < ActiveRecord::Base 
    attr_accessible :content, :user_id, :title 
    validates :content, :length => { :maximum => 140 } 
    belongs_to :user 
    delegate :email, to: :user 
end 
+1

與此問題類似:http://stackoverflow.com/q/2463962/178651 – 2013-02-25 21:12:00

回答

1

有很多的東西在那裏。首先,爲了能夠根據用戶過濾項目(或操作),您需要知道當時是誰登錄的,因此可以讓用戶登錄。這可以通過使用Devise(Rails授權寶石)來完成。設計主要是使用和有據可查的。

設置Devise後,您可以檢查用戶是否已登錄(例如使用before_filter),並且Devise會創建一個「current_user」變量供您使用(顯示在Devise tutorial中)。然後,你可以用它的東西,如過濾你的項目清單:

editable_items = current_user.items 

然後用你的觀點的editable_items。我建議你去閱讀Devise教程,因爲你正在做的是一個相當常見和有據可查的任務。

+0

謝謝,馬丁。我會檢查一下。 – momchenr 2013-02-26 15:15:36

+0

很高興能夠提供幫助。如果這回答你的需要,請註冊並接受它作爲答案。如果沒有,請評論,以便我可以編輯它。 – Martin 2013-02-26 15:23:39

+0

因爲我沒有聲望,所以無法贊成,但我已經接受它作爲我的答案。 – momchenr 2013-02-26 18:35:32

0

我落得這樣做:

<% if item.email == current_user.email %> 

和它的工作是......好嗎?

1

如果可以的話,我會發表評論,但是我認爲這必須參考@momchenr發佈的答案(回答他們自己的問題)作爲所選答案的後續內容。

@momcher寫道:

我落得這樣做:

<% if item.email == current_user.email %> 

和它的工作是......好嗎?

可能不是。但這取決於你的系統是如何建立的。如果用戶可以編輯他們的電子郵件地址和/或電子郵件地址不被強制爲獨一無二的,他們可以通過臨時更改他們的電子郵件地址或僅僅以新用戶的身份註冊來獲得對其他用戶的「項目」的編輯訪問權限已知用戶的電子郵件地址。

即使您永遠不會在您的應用程序中顯示用戶的電子郵件地址,但當您在用戶提供的字段中保留大量身份驗證過程時,還存在固有的漏洞。

不知道究竟事情是如何只設計根據您的信息設置中提供,我倒是嘗試以下操作:

這兩種可能都依賴於ActiveRecord的時候的狀態下的觸摸慢所謂

  • <% if item.user == current_user %>
  • <% if item.user.id == current_user.id %>

這一個應該是一個觸摸更快罪CE時,不是從item對象獲取user對象

  • <% if item.user_id == current_user.id %>

沒有,如果我是正確的還是錯誤的事(你只是直接從user對象的user_id方法拉)我快速猜測,這通常是比你說的更適合你的解決方案。由於用戶的ID永遠不會受到他們的直接控制,除非您的代碼存在重大漏洞 - 他們不能輕易地構成其他用戶。

相關問題