Контролерите с пространство от имена на Rails 3.2.3 се заместват от глобални контролери със същото име

Когато глобалният контролер на приложението се зарежда първи, контролерът на приложението с пространство от имена не се зарежда при зареждане на страници в това пространство от имена. Контролерът на приложението изглежда така:

class ApplicationController < ActionController::Base
 protect_from_forgery
end

И контролерът за приложения с пространство от имена изглежда така:

class Admin::ApplicationController < ApplicationController

def authenticate_admin!
 if current_admin.nil?
  redirect_to new_admin_session_url
 end
end

private

 def current_admin
  @current_admin ||= Admin.find(session[:admin_id]) if session[:admin_id]
 end

helper_method :current_admin
end

Когато използваме before_filter "authenticate_admin!" като този:

class Admin::AssetsController < Admin::ApplicationController
  before_filter :authenticate_admin!
end

Извежда се „NoMethodError в Admin::AssetsController#new“. Това се случва само когато достигнем глобалния маршрут преди маршрута с пространство от имена. Ако сървърът се рестартира и първо се зареди маршрутът с пространство от имена, всичко работи правилно.


person Bryan Ashley    schedule 05.06.2012    source източник
comment
В какви файлове са тези контролери?   -  person Frederick Cheung    schedule 05.06.2012
comment
app/controllers/admin/application_controller.rb, app/controllers/admin/assets_controller.rb и app/controllers/application_controller.rb   -  person Bryan Ashley    schedule 05.06.2012


Отговори (2)


Това се случва, защото случайно имате модел Admin (клас) със същото име като вашето пространство от имена.

Тази групова нишка на Google дава добро обяснение какво точно се случва.

За да коригирам, бих преименувал модела на AdminUser или ако това не е възможно, преименуването на пространството от имена също ще реши проблема.

person Bart Jedrocha    schedule 05.06.2012

Контролерите с пространство от имена трябва да се показват в правилната структура на директорията.

app/controllers/admin/application_controller.rb

app/controllers/admin/assets_controller.rb

Лично аз бих посъветвал да не претоварвате името ApplicationController за базов контролер с пространство от имена. Това няма да е причина за проблема, но е въпрос на предпочитание - има само едно приложение и трябва да има само едно ApplicationController. Може да използвате ContentManagementController, ако това е целта на пространството от имена Admin.

Второ, по-добра практика е да използвате ключовата дума module и да дефинирате вашите контролери по този начин:

module Admin
  class ContentManagementController < ApplicationController
      # ..
  end
end

# app/controllers/admin/content_management_controller.rb

редактиране: Току-що видях и конкретната грешка (може би въпросът ви е актуализиран?) - трябва да дефинирате новото действие на AssetsController

def new
   #
end
person brentvatne    schedule 05.06.2012
comment
Съжалявам, че не го споменах преди; контролерите са в правилната структура на директорията, именувани точно както сте посочили. Имаме действия в AssetsController, просто не ги поставихме в оригиналната публикация, тъй като не изглеждаше подходящо. - person Bryan Ashley; 05.06.2012