2012-05-11 166 views
0

我目前正在研究Rails中的一個愛好項目,並且偶然發現了我認爲是Rails中的一個常見問題。我已經通過了幾章和Lynda教程,但是我還沒有找到針對這個問題的最佳實踐。也許在線社區可以幫助我。差分訪問控制。最佳實踐

在我application.html.erb我加入以下代碼:

<!DOCTYPE html> 
<html> 
<head> 
    <title>SioMeny</title> 
    <%= stylesheet_link_tag "application", :media => "all" %> 
    <%= javascript_include_tag "application" %> 
    <%= csrf_meta_tags %> 
</head> 
<body> 
    <div id="wrapper"> 
    <header> 
     <h1>SiO Menysystem</h1> 
    </header> 
    <div id="site_menu"> 
     <%= render :partial => "shared/admin_menu" if admin_logged_in? %> 
     <%= render :partial => "shared/user_menu" if logged_in? %> 
     <%= render :partial => "shared/site_menu" %> 
    </div><!-- div#site_menu --> 
    <div id="main"> 
     <%= render :partial => "shared/flash", :locals => {:flash => flash} unless flash.nil? %> 
     <%= yield %> 
    </div> 
    </div><!-- div#wrapper --> 
</body> 
</html> 

我的問題在#site_menu,並在不同的泛音的加載啓動。我嘗試在這裏實現的是根據用戶可能擁有的權限擴展的菜單。 logged_in?和admin_logged_in?位於application_controller中。

class ApplicationController < ActionController::Base 
    protect_from_forgery 


    def login_required 
    unless logged_in? 
    flash[:notice] = "Du må være logget inn for å se denne siden" 
    redirect_to :controller => "user", :action => "login" 
    end 
end 

    def admin_required 
    unless admin_logged_in? 
    flash[:notice] = "Du må være logget inn som administrator for å se denne siden" 
    redirect_to :controller => "user", :action => "login" 
    end 
end 



    def logged_in? 
    if session[:user_id] 
    return true 
    end 
    return false 
end 

    def admin_logged_in? 
    if logged_in? 
     user = User.find_by_id[:user_id] 
    if user.is_admin? 
     return true 
    end 
    end 
    return false 
    end 


end 

在這一點上,我得到一個錯誤:

ArgumentError in Site#index 

Showing /Users/ola/Documents/Coding/SioMeny/app/views/layouts/application.html.erb where line #15 raised: 

wrong number of arguments (0 for 1) 
Extracted source (around line #15): 

12:  <h1>SiO Menysystem</h1> 
13:  </header> 
14:  <div id="site_menu"> 
15:  <%= render :partial => "shared/admin_menu" if admin_logged_in? %> 
16:  <%= render :partial => "shared/user_menu" if logged_in? %> 
17:  <%= render :partial => "shared/site_menu" %> 
18:  </div><!-- div#site_menu --> 
Rails.root: /Users/ola/Documents/Coding/SioMeny 

任何幫助是非常歡迎!我也試着讓這兩個logged_in函數設置一個實例變量,這個實例變量是在視圖中檢查過的布爾類型,這個工作,但不是所有的時間,因爲它們取決於它們的設置時間。我也嘗試在助手中製作類似的方法,並從視圖中調用它們,但這也不起作用。

回答

0

我認爲你的問題是admin_logged_in中的這一行嗎?

user = User.find_by_id[:user_id] 

使用在find_by_id的端部的托架,沒有通過符號作爲一個參數,它只是直接與無參數調用find_by_id。而find_by_id需要一個參數。假設你的params散列中有一個:user_id,你可以這樣做:

user = User.find_by_id(params[:user_id]) 
+0

謝謝你發現這個錯誤。這花了我很長時間,我甚至沒有找到它:)順便說一下,你知道任何處理更多用戶類型的最佳做法嗎? – olovholm

+0

沒問題。 :)看起來像處理不同權​​限的流行方式是通過使用角色。我會看看下面的寶石,他們可能會指出你正確的方向:easy_roles,devise,和cancan(或者canable,或者權威)。 – Adam