2010-08-05 3 views
0

각기 다른 유효성 검사를 가진 총 7 개의 모델을 포함하는 중첩 된 양식으로 작업하고 있습니다. 양식을 간단히 편집 할 때 유효성 검사가 실행되고 올바르게 표시되며 데이터가 제대로 저장됩니다. 그러나 양식 제출자에 따라 다른 유효성 검사가 필요합니다 (예 : 관리자가 다른 필수 필드를 건너 뛸 수 있음).깊게 중첩 된 양식의 현재 사용자에 따라 실행되는 레일스 변경

내 모델에서 attr_accessible : editing_user를 사용하여 특정 유효성 검사를 건너 뛸 수 있다고 생각한 다음 컨트롤러에서 설정합니다.

class ModelExample < ActiveRecord::Base 
    attr_accessible :editing_user 
    validates_presence_of :email, :unless => "editing_user == 'admin'" 
end 

class ModelExamplesController < ActionController::Base 
    def create 
    @model_example = ModelExample.new(params[:model_example]) 
    @model_example.editing_user = 'admin' 
    @model_example.save 
    end 
end 

중첩 모델 내에서이 기본 구조를 사용하여 제대로 저장할 수 있는지 확인했습니다. 이것은 이상한 행동이 시작되는 곳입니다. ActiveRecord가 중첩 모델을 여러 번 저장하려고 할 때마다 매번 유효성 검사를 실행하는 것처럼 보이는 이유가 있습니다. 이상하게 만드는 것은 @ model_example.save를 호출하는 것입니다. @ model_example.save는 실패 할 경우 false를 반환해야합니다. 그러나 첫 번째 유효성 검사가 완료되면 (editing_user가 설정되었으므로) 나중에 유효성 검사가 실패하고 예외가 발생하므로 정상 .save 메서드는 반환되는 대신 예외를 발생시킵니다.

ActiveRecord가 모든 추가 유효성 검사 및 저장을 수행하는 것을 피하는 방법을 알고 있습니까? 아니면 중복 된 작업 전체에서 editing_user를 유지하는 방법을 알고 계십니까?

답변

1

하! 어쨌든, 어쨌든 (사용자를 유지)이 어제는 거의 똑같은 사용 사례였습니다.

class User < ActiveRecord::Base 

    module ClassMethods 
    attr_accessor :current 
    end 

    extend ClassMethods 
end 

이 코드 블록은 싱글 접근을 추가합니다 : 사용자 클래스 메서드에 전류, 사용자로 호출 할 수 있습니다 여기에 내가 (나는 복사 내 친구 제이슨 이슬에 대한 모든 신용으로) 그것을 해결하는 방법입니다. 흐름. 더 좋은 방법은 다음 블록으로 앱 컨트롤러를 통과하여 User.current var에 설정 앱 제어기

before_filter :require_user #=> which in this case goes off and sets the current_user var 
before_filter {|c| User.current = current_user} 

self.currrent

이라는 것을보고. 이 짧은 있도록 current` :

그럼 적어도 레일 3의 다른 모델

class MyClass < ActiveRecord::Base 
    def log 
    "This was done by #{User.current}" 
    end 
end 
+0

에 당신은 또한'cattr_accessor를 사용할 수 있습니다. – Mika

관련 문제