Как настроить ActiveAdmin с помощью find_by вместо ID для всех действий

просто добавив ActiveAdmin в мое приложение, у меня возникла проблема с использованием действия show/edit/destroy, потому что моя ссылка не указывает на ID, а на имя пользователя (чтобы быть более читаемым для пользователя).

ActiveAdmin правильно создаст мою ссылку:

изменить ссылку: http://localhost:3000/admin/users/paul/edit (where paul is the user name)

в этом случае я получаю: Couldn't find User with ID=paul

причина, конечно, Павел не является идентификатором, а именем пользователя.

Как я могу настроить ActiveAdmin для использования find_by_name (params [: id]), как в моем приложении, для всех действий show/edit/delete.

В другой модели я получил так называемый "SID", который является сгенерированным соленым идентификатором, и я хотел бы также использовать find_by_sid (params [: id]) для других моделей.

Большое спасибо.

Приветствия..

Ответ 1

Это выполнит задание в приложении /admin/user.rb:

ActiveAdmin.register User do
    before_filter :only => [:show, :edit, :update, :destroy] do
        @user = User.find_by_name(params[:id])
      end
end

Ответ 2

Существует более чистый способ сделать это:

ActiveAdmin.register User do
 controller do
  defaults :finder => :find_by_slug
 end
end

Ответ 3

Если вы следовали за этим railscast: http://railscasts.com/episodes/63-model-name-in-url-revised и имеют настраиваемые маршруты, вы можете исправить маршруты active_admin, поместив это в приложение /admin/user.rb:

before_filter :only => [:show, :edit, :update, :destroy] do
  @user = User.find_by_slug!(params[:id])
end

Это действительно близко к тому, что показано afiah, немного отличается.