2013-02-28 53 views
0

我有一個應用程序,用戶可以提名一個可以查看其賬戶的密鑰持有者。我有一個before_filter,意思是隻有賬戶持有人或他們的鑰匙持有者才能查看他們的賬戶。此代碼適用於查看用戶主頁的任何人,但我無法進一步做任何事情 - 我當前以密鑰持有者身份登錄,並且無法註銷,或者向任一帳戶添加「註釋」(現在鑰匙持有人可以無限制地訪問他們自己的賬戶和鑰匙持有人)。請任何人都可以幫忙?rails before_filter阻止訪問控制器

的是的before_filter:

def correct_user 
     @user = User.find(params[:id]) 

     unless (@user && current_user.id == @user.id) || (([email protected])&&([email protected]_id)) 
      redirect_to root_path 
     end 
     end 

,並試圖例如,當我收到錯誤創建一個需要注意的是:

ActiveRecord::RecordNotFound in NotesController#new 
Couldn't find User without an ID 

它指的是在對的before_filter @user線。

當我作爲鑰匙持有人登錄後,我可以查看主頁,但除此之外什麼也不做?謝謝!

UPDATE:

更新的before_filter(在application_controller.rb):

def correct_user 
     if params[:id] 
      @user = User.find(params[:id]) 

      unless (@user && current_user.id == @user.id) || (([email protected])&&([email protected]_id)) 
      redirect_to root_path 
      end 
     else 
      redirect_to root_path 
     end 
     end 
上說明創建

控制檯輸出:

Started POST "/notes" for 127.0.0.1 at 2013-02-28 14:10:49 +0000 
Processing by NotesController#create as HTML 
    Parameters: {"utf8"=>"V", "authenticity_token"=>"qMDHQAoC4l3Be5YZKSH1AJ9E5zS1D 
kMNCW2KzUZ38gM=", "note"=>{"user_id"=>"16", "content"=>""}, "commit"=>"Update Note"} 
Redirected to http://localhost:3000/ 
Filter chain halted as :correct_user rendered or redirected 
Completed 302 Found in 98ms (ActiveRecord: 0.0ms) 


Started GET "/" for 127.0.0.1 at 2013-02-28 14:10:49 +0000 
Processing by PublicController#index as HTML 
    ←[1m←[36mUser Load (3.0ms)←[0m ←[1mSELECT "users".* FROM "users" WHERE "users 
"."id" = 16 LIMIT 1←[0m 
    Rendered public/index.html.erb within layouts/application (5.0ms) 
    ←[1m←[36mTimeline Load (3.0ms)←[0m ←[1mSELECT "timelines".* FROM "timelines" 
WHERE "timelines"."user_id" = 16 LIMIT 1←[0m 
    ←[1m←[36mMessageBoard Load (2.0ms)←[0m ←[1mSELECT "message_boards".* FROM "me 
ssage_boards" WHERE "message_boards"."user_id" = 16 LIMIT 1←[0m 
    Rendered partials/_menuoptions.html.erb (53.0ms) 
Completed 200 OK in 551ms (Views: 535.0ms | ActiveRecord: 16.0ms) 
+0

當你去的音符控制器,你沒有一個'PARAMS [:編號]'這是什麼造成的錯誤。 – jvnill 2013-02-28 13:45:02

+0

爲什麼會出現該錯誤,爲什麼它也會阻止我註銷?該id甚至沒有傳遞給設計銷燬會話操作? – ecs 2013-02-28 13:47:19

+0

你不能註銷,因爲之前的過濾器優先於銷燬會話 – jvnill 2013-02-28 13:49:47

回答

0

試試:

def correct_user 
      if current_user 
       @user = User.find(current_user.id) 

       unless (@user && current_user.id == @user.id) || (([email protected])&&([email protected]_id)) 
       redirect_to root_path 
       end 
      else 
       redirect_to root_path 
      end 
      end 

其實這裏沒有params[:id]這樣的東西。 current_user是您正在查看的用戶,因此您可以使用上述current_user.id直接查找。用上面的代碼替換,如果你找到其他的可能性最好。這只是一個實施的想法。

+0

我仍然懷疑帳戶所有者或密鑰持有者是您在'correct_user'操作中傳遞的id的人。只要找出你爲什麼沒有得到那個人的身份證。你不能把這個'before_filter'直接放在應用程序控制器中,因爲它會直接傳遞這個人的nil參數。一開始你沒有任何這樣的人來檢查。您必須在應該傳遞給'correct_user'動作的地方提供person id參數。 – 2013-02-28 14:42:55

+0

我的錯誤 - 我在我的控制器中有一個流氓代碼片段,我曾嘗試在動作中傳遞該ID。刪除,並過濾器正常工作,感謝您的幫助! – ecs 2013-02-28 14:46:55

0

我認爲你驗證上太多無論如何,這個問題似乎在get/post請求中,因爲沒有id到達控制器動作,你能附加發送給控制器的參數嗎?從控制檯複製它們,這將是更容易閱讀...

"note"=>{"user_id"=>"16", "content"=>""} 

您對使用params[:note][:user_id]來獲取用戶ID,你必須與用戶ID添加一個隱藏字段能做你想做的事情,如果你問我,我不認爲這是一種好的做法,你有沒有看過任何Railscast?,我敢肯定,你可以在那裏找到很多有用的技巧,看看這個例如:

Railscast Cancan

希望它可以幫助...

+0

我已經將它添加到原來的問題 – ecs 2013-02-28 14:16:25

+0

是的,我已經看到了CanCan上的一個,並且在嘗試自己做這件事之前查看了文檔 - 它似乎並不是只允許一個用戶訪問另一個用戶指定的帳戶,只是不同級別的用戶,即管理員,用戶等,誰擁有所有帳戶相同的權限? – ecs 2013-02-28 14:30:45

+0

隨着康康舞,你可以定義你想要的所有權限,它在某些情況下,一個有點棘手,但這裏的容易的道路,我相信這是形式保存用戶ID的上一個隱藏字段.. – kainlite 2013-02-28 14:35:10

0

當你去註釋/新的時候,你沒有提供任何id參數,這就是你得到這個異常的原因。

你必須先檢查是否PARAMS [:ID]存在:

def correct_user 
    if params[:id] 
    @user = User.find(params[:id]) 

    unless (@user && current_user.id == @user.id) || (([email protected])&&([email protected]_id)) 
     redirect_to root_path 
    end 
    else 
    redirect_to root_path 
    end 
end 

,並在鏈接到Notes /新,你必須提供用戶ID PARAM:

<%= link_to "New note on #{@user.name}", new_note_path(id: @user.id) %> 
+0

只是好奇,關於上面的'link_to' :爲什麼需要在新行動中使用參數ID? 'new.html.erb'的形式將自動創建子上的id,因爲這是主鍵自動增量字段。 – 2013-02-28 13:53:40

+0

但是這種情況下的ID不是在筆記模型中查找的,而是用於用戶模型 – Alejo 2013-02-28 13:55:21

+0

即使id不查找,如果我們做了如下操作:'Notes.create(:field1 =>「value1 「,:field2 =>」value2「)'不給id值,那麼它也會創建自動id增加的行。此外,創建操作需要的是id,而不是新的操作,因爲它是我們發送id params的地方。 – 2013-02-28 13:58:39