2013-07-18 2 views
1

특정 모델과 일대일로 대응하지 않는 여러 가지 양식이 있습니다. 필자는 관련 양식 유효성 검사와 일치하지 않는 특정 유효성 검사가있는 경우 양식 개체 패턴 (또는 Decorator 등)을 사용하여 이러한 양식을 강화했습니다.양식 개체에 경로를 정의하는 방법

예 :

class ProfileClaimRequestForm 
    extend ActiveModel::Naming 
    include ActiveModel::Conversion 
    include ActiveModel::Validations 

    attr_accessor :email, :profile 
    delegate :persisted?, :id, to: :profile #?? 

    validate :matching_emails 

    def initialize profile, email = nil 
    self.profile = profile 
    self.email = email 
    end 

    private 

    def matching_emails 
    errors.add(:email, 'The email address entered does not match our records') unless self.email == self.profile.profile.email 
    end 
end 

그러나 나는 그 길 선언을 건조 할 수 바라고, 내가 잘 작동 form_for @form_obj, profile_claim_path(@form_obj.profile.id)을 사용하고이를 호출합니다. 나는 내 양식 객체가 경로 나 비슷한 것을 정의하도록 응답 할 수있는 마법 방법이 있는지 궁금합니다. 이상 적으로 나는 그것을 내려받을 수있다 form_for @form_obj

나는 현재 레일즈 3에 있지만 우리는 가까운 미래에 레일즈 4로 이동할 계획이다.

답변

0

form_for @form_obj을 호출하면 레일스는 리소스에서 to_param을 호출하고 routes.rb의 resources 정의를 사용하여 경로를 생성합니다. 이것은 Rails 규칙을 따를 때 유용합니다.

예 : 이제 경우에이 규칙을 다음되지 않습니다

form_for @useraction="https://stackoverflow.com/users/1" (주어진 사용자의 ID은 1) 생성되므로 업을 건조 할 수있는 유일한 방법은 중첩 된 리소스를 사용했을 것이다.

하면, 당신의 route.rb에서이 같은 자원을 정의하는 것입니다 :

resources :users do 
    resources :profiles 
end 

그런 다음 레일은 예를 들어 /users/:id/profiles 같은 경로를 생성합니다. 당신이 레일에게 규칙을 따르지 않는 경우 form_for의 긴 구문을 사용하고

+0

하면 폼의 대상 경로를 수동으로 지정해야합니다 그리고 당신은 짧은이 form_for [@user, @profile]

긴 대답과 같은 형태의 도우미로 직접 사용할 수있을 것 중첩 된 추가 명령을 사용하여 해당 규칙을 사용할 수 있습니까? 'resources profiles do 'start_claim' end' – Drew

+0

네, 네스트 한 리소스 ('콜렉션'과 '멤버'참조)에서 경로를 커스터마이징 할 수 있지만'form_for'는 항상 디폴트를 사용합니다 'create '및'업데이트 '경로를 선택하십시오. 자세한 내용은 http://guides.rubyonrails.org/routing.html을 참조하십시오. – Benj

+0

@Drew, 제 답변이 당신의 솔루션을 찾는 데 도움이 되었습니까? – Benj

관련 문제