DonutWorks / Ari

0 stars 0 forks source link

Feature/decorate using draper #376

Closed yhoonkim closed 9 years ago

yhoonkim commented 9 years ago

Draper를 이용하여 decorator를 적용 하였습니다.

delegate_all 을 하여서 그런지 decorator에서 기존의 있는 이름으로 또 반환할 수가 없더라고요. 예를들면

class MessageDecorator < Draper::Decorator
  delegate_all

  def created_at
    created_at.localtime.strftime("%Y-%m-%d %T")
  end

end

으로 구현하면 stack is too deep 하다면서 에러가 납니다. decorate된 것과 안된것에 차이를 둬야 할 것 같아서 pretty_ 라는 prefix를 두었습니다.ㅠㅠ

+ .decorate을 부르는 것은 controller에서 하는게 좋을까요? view에서 하는게 좋을까요?

angdev commented 9 years ago

원래 객체는 object 함수를 이용하여 참조할 수 있는 것 같습니다. 아래와 같이 하면 의도한 방향대로 작성할 수 있을듯!

class MessageDecorator < Draper::Decorator
  delegate_all

  def created_at
    object.created_at.localtime.strftime("%Y-%m-%d %T")
  end
end
MoojinChae commented 9 years ago

마지막에 궁금해 했던 내용은 Todonut 할 때 멘토님이 말씀해 부분 참고 하면 좋을듯! https://github.com/DonutWorks/ToDo.nut/pull/68

shaynekang commented 9 years ago

아 커밋 메시지에 "one more thing..."은 뭐여 ㅋㅋㅋㅋ 궁금하셨던 부분은 @FeGs 와 @MujinChae 이 설명한 그대로입니다. 수정해서 반영해주시면 될 것 같네요~

yhoonkim commented 9 years ago
shaynekang commented 9 years ago

모든 Gem들에는 그 나름대로의 사용법이 있습니다. 이를 응용하는 연습을 하는 것도 좋지만, 처음에는 메뉴얼을 그대로 따라가는 게 가장 쉽게 배우는 방법이라고 생각합니다. ㅎㅎ

그런 의미에서, Draper에서는 보통 pretty_와 같은 접두어를 붙여서 사용하지 않습니다. overriding이 헷갈릴 수도 있다는 건 사실입니다만, 그렇다면 Draper를 사용 안 하는게 맞겠죠. 처음에는 Draper에서 권장하는 방식으로 구현하면 좋을 것 같습니다. ㅎㅎ

모델에 있는 내용을 그대로 사용하는 경우는 decorator.object.model_method와 같이 호출합니다. @user.generation_id의 경우는 데코레이터로 감싸주면 @user_decorator.object.generation_id로 호출할 수 있겠죠.

위의 방식을 쓰는게 지저분하다고 생각될 경우에만 데코레이터에서 별도의 메소드를 만들어 줍니다. 다만 그런 예외적인 케이스를 제외한 나머지 부분은 모두 overriding이 디폴트입니다. ㅎㅎ

yhoonkim commented 9 years ago

@shaynekang 넵! 알겠습니다. 그럼 prefix를 제외하고 다시 커밋하도록 하겠습니다~

shaynekang commented 9 years ago

@yhoonkim -_-)b