Rails에서 activeadmin을 사용할 때 to_param을 id가 아닌 경우 처리

activeadmin 는 매우 편리하네요!
쉽게 관리 화면을 만들 수 있을 뿐만 아니라, 어느 정도의 커스터마이즈에도 대응할 수 있습니다.

무엇을 하고 싶은가



Rails에서는 모델에 to_param라는 메서드가 있으며 이를 덮어 쓰면 URL에 포함 된 :id를 다른 열로 만들 수 있습니다.
예를 들면 다음과 같이 하면 /events/:id/ 의 id를 name 컬럼으로 할 수 있습니다.
class Events < ApplicationRecord

  def to_param
    name
  end

end

to_param의 덮어쓰기는 자주 한다고 생각합니다만, activeadmin에서의 대응 방법이 넷에서 찾아내기 어려웠기 때문에, 기사로 하려고 합니다.

무슨 일이 일어나는가



위와 같이 to_param을 덮어 쓰면 activeadmin은 어떻게됩니까?

activeadmin은 이제 모델 구조를 분석하여 자동으로 관리 화면을 만들 수 있습니다. 그 때문에 to_param 도 제대로 인식해 줍니다.
그러나 덮어 쓴 상태에서 activeadmin에서 상세 화면이나 편집 화면을 보려고하면 오류가 발생합니다.


이것은, admin/events 에 표시되는 「열람・편집・삭제」등의 링크가 to_param에 의해 admin/events/:name/ 이 되고 있지만, 내부의 find 이나 where 에서는 id로 검색하고 있는 것에 귀착됩니다.

해결책



ActiveAdmin.register의 파일에 약간의 옵션을 쓰는 것만으로 대응할 수 있습니다.
ActiveAdmin.register Event do

  # ここから
  controller do
    def find_resource
      scoped_collection.where(name: params[:id]).first!
    end
  end
  # ここまで
end


읽고 있는 것만으로 이해할 수 있을 것 같습니다.
보통 where(id: params[:id]) 가 되는 곳을 where(name: params[:id]) 로 하는 것 뿐입니다.

주의점



공식적으로는 다음과 같은 문언으로 주의점이 적혀 있습니다.
Note that if you use an authorization library like CanCan, you should be careful
to not write code like this, otherwise **your authorization rules won't be
applied**:

```ruby
ActiveAdmin.register Post do
  controller do
    def find_resource
      Post.where(id: params[:id]).first!
    end
  end
end

이것은, 모델명이 아니고, scoped_collection (을)를 사용하지 않으면 admin의 권한 관리가 기능이 효과가 없어요. 그렇군요. 여러분도 조심하세요!

좋은 웹페이지 즐겨찾기