레일의 폼헬퍼는 폼을 만드는 과정을 정말 쉽게 해결해 주는 마법사같은 역할을 합니다. 확실히 레일즈에서 라우트와 폼헬퍼의 유기적인 동작을 보면 왜 레일즈가 유명한지 실감하게 되는것 같습니다. 오늘 겪었던 STI로 인해 폼헬퍼의 form_for가 정상적으로 동작하지 못하는 문제의 해결방법을 기록차 정리합니다.
사실 문제를 해결하는 방법은 없습니다. 기본적으로 form_for가 유입경로에 따라 어디로 라우팅 해야 하는지를 자동으로 결정해 주지만 STI를 사용한 Model의 핸들링의 경우 수동으로 처리해 주어야 합니다. 심지어 홈헬퍼 레퍼런스에서도 이렇게 설명하고 있습니다.
결과적으로 :url과 :method를 이용하여 명시적으로 어디로 라우팅할지를 결정해 주어야 한다는 것입니다. Project라는 이름의 Model을 수정하는 경우라고 가정할 때 컨트롤러는 다음과 같습니다.
def edit @project = Project.find(params[:id]) end
그리고 뷰에서 form_for를 활용하는 코드는 다음과 같습니다.
<% form_for(@project, :as => :project, :url => {:controller => "projects",:action => "update"}) do |f| %> ... <%= submit_tag 'Update' %> <% end %>
:url 설정에서 컨트롤러와 액션을 직접 선택한것을 볼 수 있습니다. 이 설정을 통해 적절한 method가 선택되며 라우팅 문제는 이것으로 해결할 수 있습니다. 하지만 project_TYPE_FIELDNAME처럼 데이터가 이상하게 들어오는 문제가 남아있습니다. 이부분은 :as를 통해 모델을 재정의할 수 있습니다.
참고