2014-11-19 2 views
0

Я пытаюсь немного изменить поведение одного метода контроллера. Здесь он говорит, что я могу сделать, что запуск rails генерирует devise: пользователей контроллера.Настройка контроллера разработки

Однако это только что сгенерированный прокомментированный код с кучей супер вызовов. Если я не знаю, что делают супер-методы, как я должен редактировать строки кода, которые я хочу изменить?

Модификация, которую я хочу сделать, проста: если еще нет пользователя-администратора (ни один с role = admin не найден), тогда роль пользователя будет установлена ​​на admin, иначе он будет обычным пользователем. Так я думал, что в этом случае after_filter будет решение, так что я сделал это:

class UserController < Devise::RegistrationsController 
    after_filter :set_role, only: [:create] 

    protected 
    def set_role 
     admin_user = User.find_by_role(User::admin_role) 
     if admin_user.nil? 
      @user.role = User::admin_role 
     else 
      @user.role = User::default_role 
     end 
     @user.save 
    end 
end 

Мои маршруты:

devise_for :users, controllers: { users: "users" } 

Однако этот метод даже не выполняется. Зачем? Что я могу сделать?

ответ

0

Я думаю, что вы должны быть переопределение контроллер регистрации:

devise_for :users, :controllers => {:registrations => "registrations"} 

Затем контроллер:

контроллеры/registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController 

    def create 
    build_resource(sign_up_params) 

    admin_user = User.find_by_role(User::admin_role) 
    if admin_user.nil? 
     resource.role = User::admin_role 
    else 
     resource.role = User::default_role 
    end 

    if resource.save 
     if resource.active_for_authentication? 
     set_flash_message :notice, :signed_up if is_navigational_format? 
     sign_up(resource_name, resource) 
     respond_with resource, :location => after_sign_up_path_for(resource) 
     else 
     set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format? 
     expire_session_data_after_sign_in! 
     respond_with resource, :location => after_inactive_sign_up_path_for(resource) 
     end 
    else 
     clean_up_passwords resource 
     respond_with resource 
    end 
    end 
end 
+0

как вы получите код для 'RegistrationsController :: create'? Потому что, как я уже сказал, при генерации контроллеров с помощью «rails g devise: users users» я получил только комментарии 'super'. Где я могу найти эти методы (думаю, вы скопировали их из источника)? – dabadaba

+0

Кроме того, выполнение того, что вы говорите, возвращает эту ошибку 'uninitialized constant RegistrationsController' – dabadaba

+0

Да, моя была непосредственно из источника (разработка 3.0.3). Вы перезапустили свой сервер? Вы поместили его в каталог контроллеров? Это не подпапка внутри него? – RichardAE

Смежные вопросы