2013-09-26 4 views
0

내 Rails 앱에서 새 오브젝트에 대해 중첩 모델을 허용하는 몇 가지 양식이 있습니다. 그래서 예를 들면 : 그래도 난 그 폼을 표시하기 전에레일 컨트롤러/양식 - 중첩 모델을 만들 위치는 어디입니까?

class Maker < ActiveRecord::Base 
    has_many :cars 
    accepts_nested_attributes_for :cars 
end 

class Car < ActiveRecord::Base 
    belongs_to :maker 
end 

, 내 메이커 모델의 중첩 된 모델의 일부를 구축해야하거나 양식에 표시되지 않습니다. 예 :

maker = Maker.new 
3.times do 
    maker.cars.build 
end 

하지만 이상적으로이 코드는 어디에 있어야합니까? 자체 모델로 form_display 기능, 컨트롤러, 데코레이터 등?

답변

1

이 질문에 대한 답은 다소 의견을 기반으로합니다. 관심의 분리 관점에서 이미 프로젝트에서 데코레이터를 사용하고 있다면 컨트롤러 나 모델보다 로직을 배치하는 것이 더 합리적 일 수 있습니다.

# maker_decorator.rb 
def cars 
    if object.new_record? && object.cars.none? 
    3.times { object.cars.build } 
    end 

    object.cars 
end 

당신이 컨트롤러 로직을 가하고, 장식 처리하지 않으려면

는 (한이 여러 작업을 통해 중복되지 않는 것 같은) 합리적인 접근 방식을 보인다. 나는 그 모델과 뷰 우려의 다소 노골적인 혼합 이후 accepts_nested_attributes_for의 사용이 그 길 아래로 당신을 추진하는 경향이 있지만,이 기능을 처리하기 위해 모델의 코드를 추가하지 않을

# makers_controller.rb 
def new 
    @maker = Maker.new 
    3.times { @maker.cars.build } 
end 

. "Form objects"는이 문제를 피할 수 있습니다 만, 이것은 당신의 경우에있어서 큰 해결책이 될 수 있으며, 현재이 패턴에 대한 확립 된 라이브러리 나 규칙은 거의 없습니다 (see #3 in this blog post).