0

我似乎在我的Ruby on Rails應用程序中有一個授權呃逆。我一直在我的應用程序控制器中使用以下方法,並且它一直在工作得很漂亮。如何處理由於控制器命名錯誤導致的授權呃逆?

def require_owner 
    obj = instance_variable_get("@#{controller_name.singularize.camelize.underscore}") # LineItem becomes @line_item 
    return true if current_user_is_owner?(obj) 
    render_error_message("You must be the #{controller_name.singularize.camelize} owner to access this page", root_url) 
    return false 
end 

我然後在特定的控制器過濾:

before_filter :require_owner, :only => [:destroy, :update, :edit] 

我最近創建了有一點,這似乎是導致問題的不同的命名約定的一個新的控制器。通常我的控制器讀取messages_controllerposts_controller。在這個特定的情況下,我將資源box_wod命名爲box_wods_controller

這是唯一的控制器,似乎有這個過濾器的問題,所以我敢打賭,我可以告訴它是在它的命名,因此application_controller方法不承認記錄的所有者。

我沒有收到錯誤消息,但應用程序不讓我編輯,更新或銷燬記錄,因爲我不是BoxWod owner。我的路線是正確的,因爲我的關聯和正確的信息傳遞到box_wod表。

有沒有辦法重寫application_controller方法來識別box_wod資源中的下劃線?或者這甚至是我的問題?

UPDATE:

下面是在BoxWodsController的三種方法:

def edit 
    @workout_count = Workout.count 
    @box_wod = BoxWod.find(params[:id]) 
    end 

    def update 
    @box_wod = BoxWod.find(params[:id]) 

    respond_to do |format| 
     if @box_wod.update_attributes(params[:box_wod]) 
     flash[:notice] = 'BoxWod was successfully updated.' 
     format.html { redirect_to(@box_wod) } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @box_wod.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @box_wod = BoxWod.find(params[:id]) 
    @box_wod.destroy 

    respond_to do |format| 
     format.html { redirect_to(box_wods_url) } 
     format.js 
    end 
    end 
+0

我覺得很難讓它的控制器文件的命名導致你的問題。您可以將問題控制器的相關部分添加到您的問題中嗎? – karmajunkie 2010-12-07 22:27:24

回答

2

在這樣的情況下,我喜歡創造,我可以在必要時改寫的控制器方法。例如:

# application_controller.rb 
class ApplicationController 
    def require_owner 
    obj = instance_variable_get("@#{resource_instance_variable_name}") 
    # Do your authorization stuff 
    end 

    private 

    def resource_instance_variable_name 
    controller_name.singularize.camelize.underscore 
    end 
end 

# box_wods_controller.rb 
class BoxWodsController 
    private 

    def resource_instance_variable_name 
    'box_wod' # Or whatever your instance variable is called 
    end 
end 

最後,請發表您的BoxWodsController代碼,以便我們能更好地診斷問題。

1

看起來@box_wod實例變量不會被創建,直到require_owner方法被調用,因此current_user_is_owner?正在檢查一個零值,導致它總是返回false。在調用require_owner之前,可能需要另一個before_filter來填充實例變量。