2010-07-06 7 views
5

가상의 레일 응용 프로그램은 다음 리소스를 가지고 :레일 웨이

Photographers 
Images 
Comments 

Photographer 가지고있는 그, Images 많은 많은 Comments 각 작가는 로그인을 갖고

및 이미지, 댓글 및 자신의 프로필을보고, 업로드하고, 편집하고 삭제할 수 있습니다.

관리 인터페이스를 사용할 수 있으며 이미지, 사진 작가 및 댓글을 모두 편집 할 수 있습니다.

또한 사진 작가, 이미지 및 주석은 방문자가 코멘트를 추가 할 수있는 로그인없이 공용 인터페이스에서 사용할 수 있습니다.

내 질문은 : 컨트롤러를 구조화하는 레일의 방식은 무엇입니까? 이 같은 각각의 역할 '(공공, 계정, 관리자)에 대한 네임 스페이스로가는 생각 :

# For administrator 
Admin::PhotographersController 
Admin::ImagesController 
Admin::CommentsController 

# For a logged in photographer 
AccountController (?) 
Account::ImagesController 
Account::CommentsController 

# For public 
PhotographersController 
ImagesController 
CommentsController 

을하지만 -이 컨트롤러의 방법 중 일부는 중복된다. 이것이 DRY가 아니지만 이것이 최선의 방법입니까?

감사합니다.

답변

3

중복되는 경우 기본 컨트롤러를 계정/관리자 네임 스페이스로 확장 할 수 있습니다. 예를 들어 여러분 모두가 볼 수있는 액션을위한 ImagesController를 사용합니다. 이는 ApplicationController를 정상적으로 확장합니다. 그런 다음 ImageController의 관리자 버전을 사용하면 ImagesController가 확장됩니다. 그런 다음 필요한 다른 동작에 대한 관리자 버전의 메소드를 추가/덮어 쓰기하거나 require_admin과 같은 before 필터를 추가하는 것만 큼 간단 할 수도 있습니다. 예를 들어 current_user가 admin 사용자인지 확인하고 아니.

2

당신이 말했듯이, 이것은 실제로 건조하지 않습니다. 적어도, 당신은 예를 들어, 모든 요구 사항에 대한 행동 경로와 컨트롤러를 구성 할 수 : 또한 인덱스를 필요로하고 작업을 보여 주면

resources :photos, :only => [:index, :show] # offer only index and show actions to public 

scope "/admin" do 
    resources :photos # full access for logged in users 
end 

, 당신은 다른보기를로드하도록 내부에 몇 가지 검사를 추가 할 수 있습니다 (당신 말 공용 및 관리 레이아웃이 있어야 함).

다른 방법으로는/admin/sections이 아니며 로그인 한 사용자에게 편집 기능을 제공 할 수 있습니다. 그래서 일부 사진의 기록 및 소유자 인 경우 편집을 허용하고 컨텍스트 링크를 표시하십시오. 그것은 맛의 문제입니다 : P

관련 문제