2012-08-09 2 views
2

나는 당신이 할 수있는 알고레일 검증

validates :cat_no, :presence => true, :on => :create 

나는 사용자 지정 작업이 있습니다

def approve 
    @product = Product.find(params[:id]) 
    @product.update_attribute :approved, true 
    redirect_to product_path(@product) 
end 

을 그리고 난 할 싶습니다

validates :cat_no, :presence => true, :on => :approve 

이를 작동하지 않는 것 같습니다. 이 작업을 수행하는 간단한 방법이 있습니까?

답변

10

나는 당신이 검증에 대한 아이디어를 오해하고 있다고 생각합니다. 유효성 검사는 컨트롤러 동작이 아닌 모델 (save, create 또는 update)을 통해 발생하므로 사용자의 경우 approved 동작이 유효성 검사를 트리거하는 것으로는 이해가되지 않습니다.

코드를 보면,이 모델이 approved의 값이 단지의 true (즉, 라인이 될 것을 조건으로, 업데이트 때 정말 cat_no에 유효성 검사를 실행하고 싶은 것을 나에게 보인다 귀하의 approve 조치가 있으신 분은 @product.update_attribute :approved, true입니다).

나는 코드가 아래 그 달성해야한다고 생각 :

validates :cat_no, :presence => true, :on => :update, :if => :just_approved? 

def just_approved? 
    changed.include?("approved") && approved? 
end 

UPDATE :

돌이켜에서

, 위의 검증은 아마 당신이 실제로 원하는 것보다 더 관대하다. 승인 된 레코드가 있고 cat_nonil으로 변경하면 approved이 변경되지 않았으므로 유효성이 검사됩니다 (changed.include?("approved")false으로 계산 됨). 그것은 분명하지 않지만, 당신이 경우 안 컨트롤러에서 액티브 레코드 유효성 검사를 사용하려고하는 것 같다

validates :cat_no, :presence => true, :on => :update, :if => :approved? 
+0

아,이 더욱 의미를. 이제 제안 된 코드를 사용해 보겠습니다. 많은 thanks – Raoot

+0

문제 없어요, 그것이 작동하는 경우 알려 주시기 바랍니다. –

+0

슬프게도 작동하지 않는 것 같습니다. Cat_no가 누락 된 제품에서 승인을 받도록 설정했습니다. – Raoot

1

: validates 문에 지정된 : action 옵션은 제어기 조치가 아니라 모델 자체의 조치이므로 컨트롤러의 조치 승인이 모델 유효성 검증을 트리거하지 않는 이유입니다. 당신의 유효성을 문의 옵션 : 귀하의 경우에 어떻게해야

은 제거하는 것입니다

validates :cat_no, :presence => true 

지금 cat_no의 타당성을 검증 모델이 저장 될 때마다 존재합니다.

1

:

은 더 많은 가능성이 당신이 실제로 원하는 것입니다. 당신은 쉽게 할 수있는 대신 ActionController 필터를 사용할 수 있습니다
class FooController < ApplicationController 
    before_filter :cat_no, :only => :approve 

    def approve 
    # your approve action code goes here. 
    end 

    private 
    def cat_no 
    #implement your 'validation' here. 
    end 

end 

는 더 많은 정보를 위해 ActionController Filters guide를 살펴 보자.

0

이 시도 :

validates_presence_of :cat_no, on: :approve 

def approve 
    @product = Product.find(params[:id]) 
    @product.attributes = product_params 
    @product.save(context: :approve) 
    redirect_to @product 
end 

private 

def product_params 
    params.require(:product).permit(:name, :description, :cat_no) 
end