2012-05-05 5 views
0

Ruby on Rails 3.2.2를 사용하고 있으며 속성 값이 으로 설정되어 있는지 확인하는 방법이 있는지 알고 싶습니다. 프로세스 흐름 중에을 설정하십시오. 즉, title, content, updater_user_id이라는 속성을 가진 Article 클래스가 있습니다. 내 컨트롤러에서프로세스 흐름 중에 속성 값이 설정되었는지 확인하는 방법은 무엇입니까?

나는이 :

# @article.title 
# => "Sample title" 
# @article.content 
# => "Sample content" 
# @article.updater_user_id 
# => 1 

# @current_user.id 
# => 1 # Note: This value is the same as '@article.updater_user_id' 
@article.updater_user_id = @current_user.id 

# params[:article] 
# => {:article => {:title => 'Sample title 2', :content => 'Sample content 2'}} 
@article.update_attributes(params[:article]) 

나는 @article.changed 방법을 사용하려고하지만 그것이 작동하고 싶은대로 작동하지 않습니다. 사실, 그 방법은 반환

@article.changed 
# => ['title', 'content'] # Note: There isn't the 'updater_user_id' attribute 

즉, 나는 updater_user_id는 그 값이 변경되지 않은 경우에도 프로세스 흐름 중에 설정되어 있는지 확인하고 싶습니다. 나의 사용 사례는 일 때 Article 개체를 저장하기 전에 프로세스 흐름 중에 updater_user_id이 (적어도 한 번 이상) 설정되어야 함을 요구합니다. 프로세스 흐름 중에 설정되지 않으면 오류가 발생합니다.

가능합니까? 그렇다면 어떻게 만드 는가?

+0

잠깐, 속성 값이 변경되지 않았더라도 기다렸다가 설정했는지 확인하고 싶습니까? 이것의 유스 케이스는 무엇입니까? –

+0

@Andrew Marshall - Article 객체가 저장 될 때마다'updater_user_id'가 설정되도록 요구하고 싶습니다. 그렇지 않으면 오류 또는 이와 유사한 것을 발생시키고 싶습니다. – user12882

+0

아하이 봐요. 나는 그런 식으로 강요하는 코드의 큰 팬이 아니지만 그것은 나뿐입니다. 또한 AFAIK에는 내장 레일 구조가 없습니다. 'updater_user_id ='를 오버라이드시키고'after_save'를 추가함으로써 아마도 이것을 달성 할 수있을 것입니다. 그러나 여러 가지 방법으로 설정하고 보편적으로 시행하기가 어려울 수 있습니다. –

답변

0

xxx_will_change! 시도해 보셨습니까?

# in Article class 
    def updater_user_id=(new_updater_user_id) 
    self[:updater_user_id] = new_updater_user_id 
    updater_user_id_will_change! 
    end 
+0

예상대로 작동하지 않습니다 (아마도'@ article.changed' 메쏘드가'updater_user_id' 속성을 "포함"하기 때문일 것입니다). – user12882

+0

내 모델에서 코드를 테스트했습니다. 괜찮 았어! 코드'product.id = product.id; product.changed'는'[ "id"]'를 반환했습니다. 어쩌면 오타를 만들었 을까요? – jdoe

+0

질문 본문에 명시된 코드로 작성된 코드를 사용 했습니까? 예를 들어 컨트롤러 파일에 코드를 명시하고 모든 변수 상태/값이 내가 설명한 것과 같은가? 즉, "문맥"은 동일합니까? 주어진 "컨텍스트"에서'@ article.changed'는'[ 'title', 'content']'그리고'[ 'title', 'content', 'updater_user_id']' article.updater_user_id' 값이'@ current_user.id' 값과 같아서 Ruby on Rails가 채워지므로 변경되지 않았습니다.) – user12882

0

나는 이것을 테스트하지 않았습니다, 일부 예상치 못한주의 사항이있을 수 있습니다,하지만 당신은 아마 같은 것을 할 수있는 : 다음,

def updater_user_id=(val) 
    @updater_user_id_set = true 
    write_attribute :updater_user_id, val 
end 

def updater_user_id_set? 
    @updater_user_id_set || updater_user_id_changed? 
end 

def clear_updater_user_id_set 
    @updater_user_id_set = false 
end 
private :clear_updater_user_id_set 

after_save :clear_updater_user_id_set 

이 필드가 업데이트 된 플래그를 저장 updater_user_id=에 우선을 그것이 설정되어 있는지 확인하는 방법이 있습니다 (아마도 이것을 유효성 검사 또는 다른 용도로 사용하고 싶습니까?). 마지막으로 개체가 저장 될 때 플래그를 지우기 위해 후크가 추가됩니다.

관련 문제