Документы activeadmin очень легки в особенностях переопределения стандартного действия контроллера, что разочаровывает, учитывая непрозрачность исходного кода. Похоже, что многие из внутренних элементов гема изменили тонну с версией 1.0, которая делает многие старые ответы на переполнение стека непригодными для использования.
В любом случае, вот как я выше описал переопределение действия #create в моем контроллере activeadmin (в Rails 4.2.x):
controller do
def create
@user = User.create_from_admin(permitted_params[:user])
if @user.persisted?
redirect_to resource_path(@user), notice: I18n.t("admin.user.create.notice")
else
render :action => :new
end
end
end
Стоит отметить, что activeadmin ожидает, если ваша модель - Пользователь, чтобы действие создания имело заполненный экземпляр модели как @user, прежде чем он сможет отрендерить action => :new
.
Я написал внутреннюю часть моего пользовательского метода создания как метод класса для моей модели, чтобы я мог выполнить его модульное тестирование и закопать как можно меньше кода в своем коде activeadmin.
Для контекста мне нужно было переопределить это действие, потому что я использую Devise, и я хотел, чтобы мои администраторы создавали учетные записи пользователей с временным паролем и настраиваемым приветственным письмом, а не встроенным: подтверждающее письмо для самостоятельного создания. счета.
Вот метод класса User:
def self.create_from_admin(params)
generated_password = Devise.friendly_token.first(8)
@user = User.new(params)
@user.password = generated_password
@user.skip_confirmation!
if @user.save
# Code to send custom email with temp password
end
@user
end