我似乎在我的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_controller
或posts_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
我覺得很難讓它的控制器文件的命名導致你的問題。您可以將問題控制器的相關部分添加到您的問題中嗎? – karmajunkie 2010-12-07 22:27:24