구 원트노/gorails
[gorails]Using ActiveAdmin to Build an Admin UIActiveAdmin gem으로 Admin page 만들기
실제 개발 단계에서 admin page를 만드는 작업은 매우 귀찮은 작업입니다.
저는 제 서비스를 개발하는 상황이라면 admin page는 pass하고 개발합니다. 시간 대비 개발 효과가 거의 없거든요..
하지만 이렇게 gem으로 쉽게 admin page를 개발한다면 오랜 시간을 소비하지 않고 개발을 할 수 있습니다.
1. gem 설치 및 초기 설정
일단 activeadmin document에 가보겠습니다.
하지만 저희는 추가로 devise까지 설치하겠습니다. (admin page 권한 설정)
Gemfile
1 2 3 | gem 'activeadmin', github: 'activeadmin' # # Plus integrations with: gem 'devise' | cs |
이렇게 작성하고 bundle install 해줍니다. 다음으로
Bash
1 | rails g active_admin:install | cs |
입력해줍니다. 이 후 여러 파일들이 생성되어지는데 먼저 db/migrate 폴더를 확인해보겠습니다.
devise_create_admin_users.rb는 어드민 권한을 가진 AdminUser model을 만드는 마이그레이트 파일입니다.
create_active_admin_comments.rb는 댓글을 달 수 있는 Comment model을 만들어주는데 polymorphic으로 구현해서 다른 모델에도 사용할 수 있습니다.
이제 seed파일로 가보겠습니다.
미리 어드민 계정 하나가 만들어져 있습니다. 자신이 원하는 계정으로 수정해준 후
1 2 3 | rake db:migrate rake db:seed rails s | cs |
마이그레이트 후 서버를 실행해줍니다.
이제 '/admin/login' page로 접속해보겠습니다.
로그인 후
이렇게 메뉴가 설정되어 있는 것을 확인할 수 있습니다.
2. 메뉴 추가하기
1 2 | rails g scaffold User name email rails g scaffold Post title body:text published_at:datetime user:references | cs |
User, Post를 scaffold를 통해 만들었습니다.
1 2 3 | rake db:migrate rails g active_admin:resource User rails g active_admin:resource Post | cs |
마이그레이트 후 active_admin:resource 명령어를 사용해서 User와 Post를 추가해줍니다.
그리고 app/admin에 생성된 파일을 수정해줍니다.
1 2 3 4 5 6 7 8 9 | #app/admin/post.rb ActiveAdmin.register Post do permit_params :title, :body, :published_at, :user_id end #app/admin/user.rb ActiveAdmin.register User do permit_params :name, :email end | cs |
posts와 users가 추가되어진 것을 볼 수 있습니다.
3. 기능 추가하기
app/admin/post.rb
1 2 3 4 5 | member_action :publish, method: :put do post = Post.find(params[:id]) post.update(published_at: Time.zone.now) redirect_to admin_post_path(post) end | cs |
이거는 route.rb에 resources :posts 에 member를 추가시키는 역활을 합니다.
추가로 이어서
app/admin/post.rb
1 2 3 | action_item :publish, only: :show do link_to "publish", publish_admin_post_path(post), method: :put unless post.published_at? end | cs |
이 구문은 show 페이지에서 publish 기능을 추가하는데 이는 link_to 헬퍼를 사용해서 구현합니다. 중간에 있는 publish_admin_post_path(post) 경로는 위의 member_action을 통해 생성 되었습니다.
이제 posts의 show 부분에 가보면 publish 버튼이 생성된 것을 확인할 수 있습니다.
마찬가지로 publish 되어있을때 unpublish 해주는 기능도 만들 수 있습니다.
app/admin/post.rb
1 2 3 4 5 6 7 8 9 | action_item :unpublish, only: :show do link_to "unpublish", unpublish_admin_post_path(post), method: :put if post.published_at? end member_action :unpublish, method: :put do post = Post.find(params[:id]) post.update(published_at: nil) redirect_to admin_post_path(post) end | cs |
이제 index에 publish 된 것과 아닌 것, 그리고 전부 볼 수 있는 필터를 추가해보겠습니다.
app/models/post.rb
1 2 | scope :published, -> {where.not(published_at: nil)} scope :unpublished, -> {where(published_at: nil)} | cs |
이렇게 scope(scope는 클래스 메소드와 같은 기능을 한다라고 생각하면 됩니다.)를 추가해주고
app/admin/post.rb
1 2 3 | scope :all scope :published scope :unpublished | cs |
이렇게 필터 기능이 완성됬습니다.
이번 예제 코드는 github에 있습니다.
더 많은 기능을 사용하고 싶다면 https://activeadmin.info/documentation.html 에 참고하면 됩니다.
궁금하신 점 있으시면 댓글 남겨주세요!!