2012-08-24 3 views
0

나는 비계 생성기를 사용하여 만든 ProTip 모델을 가지고 있습니다. indexshow을 제외한 모든 작업에는 관리자 권한이 필요합니다.두 개의 다른 컨트롤러에서 모델을 만드는 방법

사용자가 자신의 ProTip을 제출할 수는 있지만 다른 사용자가 승인 할 때까지 대기열에 저장하도록 허용하고 싶습니다.

나는이 작업을 수행하는 몇 가지 방법을 생각할 수 있습니다

  1. ProTip과 같은 필드가 UserSubmittedProTip에 대한 전혀 다른 모델을 만듭니다. index, newcreate 작업으로 새 UserSubmittedProTipController을 새로 만듭니다. create 작업에서 새로운 ProTip을 만들고 데이터베이스에 저장하기 전에 UserSubmittedProTip에서 속성을 복사 할 수 있습니다. 내가 index 작업에 대한 관리자를 요구할 수 있으며 승인을 수행하는 데 사용할 수 있습니다.

  2. SubmitControllernewcreate 동작으로 만 새로 만듭니다. 어떤 식 으로든 ProTip_form 부분을 공유하지만 제출할 컨트롤러를 알고있는보기를 만듭니다. create 작업에서 저장하기 전에 ProTip.approvedfalse으로 설정할 수 있습니다. 그런 다음 승인을위한 메커니즘을 만들어야합니다.

첫 번째 방법은 두 번째 구현 방법을 모르기 때문에 가장 쉬운 방법입니다. 두 가지 방법 모두 조금 어색함을 느낍니다.이 문제에 대해 가장 좋은 방법이 무엇인지 궁금합니다.

이 문제를 해결할 수있는 유일한 두 가지 방법이 있습니까? 그렇지 않으면 무엇이 더 똑똑할까요? 그렇지 않으면, 어느 모범 사례에 가깝거나 둘 다 눈부신 잘못입니까?

답변

1

첫 번째 해결 방법은 권장하지 않습니다.

정말로 원하지 않는 경우에는 실제로 두 개의 컨트롤러를 사용할 이유가 없습니다.

현재 사용자가 관리자 인 경우 단순히 개체를 정상적으로 만들면됩니다.

현재 사용자가 관리자가 아닌 경우 항목을 만들지 만 해당 항목에 승인이 필요한 부울을 설정하거나 역순으로 수행합니다. 관리자 인 경우에는 "승인 됨"플래그를 설정하십시오.

관리자가 목록 작업을 볼 때 추가 '승인'열을 표시 할 수 있습니다.

def create 
    @protip = Protip.new(params[:protip] 
    # I'm assuming you have logic to determine if the user is an admin. 
    # I usually encapsulate that in a method on the user model. So 
    # my code would look like this: 
    @protip.approved = true if current_user.is_an_admin 
    if @protip.save 
    ... do your normal stuff 


end 

하면 승인 protips

scope :approved, where(:approved => true) 

그리고 항상 그 표시에 대한 범위를 확인합니다.

@protips = Protip.approved 

별도로 유지하려는 경우 확실히 부분을 다시 사용할 수 있습니다. 렌더링을 호출 할 때 부분을 가져올 위치를 지정할 수 있습니다.

render "/protips/_form" 

어떻게 시작하나요?

+0

Perfect. 자세한 답장을 보내 주셔서 감사합니다. 때로는 레일을 사용하여 한 걸음 뒤로 물러나서 보통 더 쉬운 방법이 있다는 것을 깨달을 필요가 있습니다. –

관련 문제