3

Redmine 플러그인을 작성할 때 유효성 검사에 문제가 있습니다. 테스트를 위해Redmine 후크의 유효성 확인 문제

def controller_issues_new_before_save(context = { }) 
    context[:issue].errors.add(:due_date, "A custom error") 
    end 

: 사용자 지정 오류를 추가하여

나는 문제 모델에 대한 후크를 쓰고, 후크 방법의 일환으로, 나는이 문제의 생성을 무효화하고 싶습니다 왜냐하면 나는 Issue.validate_on_create를 덮어 쓰는 패치를 작성했지만 validate_on_create errors.count를 입력 할 때마다 0으로 설정되어있는 것처럼 보입니다.

속성을 다른 모델 객체로 설정 한 경우에만 문제 객체 생성을 중지해야합니다.

나는 validate_on_create 메서드에서 이것을 작성하려고 생각했지만, 다른 개체에 전달해야 할 것입니다.

제가 생각한 첫 번째 해결 방법은 문제 모델에 추가 필드를 삽입하고 후크 내부에서 수정하는 것입니다. 같은

뭔가 :

Issue.can_validate이 문제 모델 그러나

에 추가되었습니다

def controller_issues_new_before_save(context = { }) 
    context[:issue].can_validate = false 
    end 

    def validate_on_create 
    unless can_validate 
     errors.add("error", "A custom error") 
    end 
    end 

이 여기에 가장 좋은 방법을 보이지 않는다. 더 쉬운 방법이 있습니까?

답변

5

데이터의 유효성을 검사하려면 모델을 직접 패치하고 후크를 사용하지 않아야합니다. 후크는 HTML을 페이지에 삽입하거나 컨트롤러의 제어 흐름을 변경하는 데 사용됩니다. 후크를 사용한다는 것은 애플리케이션을 통해 하나의 경로에서만 코드가 작동한다는 것을 의미하기 때문에 누군가 다른 곳에서 문제를 생성하면 코드가 실행되지 않습니다.

  • 은 레드 마인은 그것의 문제 클래스 내가했습니다
  • 에서 해당 모듈을 포함 확인

    1. 당신의 코드가 모듈을 만들고 :

      방금 ​​두 가지를 할 필요가 패치를 만들려면 기한이 미래에 설정되도록 요구하기 위해 이슈에 대한 유효성 검사를 추가하는 플러그인에서이 정확한 작업을 수행하십시오.
      module RedmineRequireIssueDueDateInFuture 
          module Patches 
          module IssuePatch 
           def self.included(base) 
           base.class_eval do 
            unloadable 
      
            validate :due_date_in_future 
      
            protected 
            def due_date_in_future 
            return true if due_date.nil? 
      
            if due_date.to_time < Date.today.beginning_of_day 
             errors.add :due_date, :not_in_future 
            end 
      
            end 
      
           end 
           end 
          end 
          end 
      end 
      

      안쪽 class_eval의

      가 자신의 코드를 삽입 할 경우, 내가 validate_on_create이 아닌 다른 이름을 사용하는 것이 좋습니다 것입니다 : 그것의 patch 그래서 나는 여기 포함됩니다 오히려 간단하다. 그렇지 않으면 해당 메소드를 사용하려는 경우 다른 코드에 문제가있을 수 있습니다.

      두 번째 부분 (Redmine에있는 모듈 포함)은 비교적 쉽습니다. Issue 클래스가 필요하고 include를 사용하여 클래스에 추가하면됩니다.

      # init.rb 
      require 'dispatcher' 
      Dispatcher.to_prepare :redmine_require_issue_due_date_in_future do 
          require_dependency 'issue' 
          Issue.send(:include, RedmineRequireIssueDueDateInFuture::Patches::IssuePatch) 
      end 
      

      개발 모드에서 작업하게하려면 Dispatcher에 이것을 포장해야합니다. 나는 그것에 대해 my blog에 대해 썼다.

      변경 사항을 적용하려면 github에서 내 플러그인을 복사해도되지만 매우 간단합니다. https://github.com/edavis10/redmine_require_issue_due_date_in_future

    4

    Redmine 2 이후.0이면 Eric Davis 응답에서 init.rb의 코드를 다음과 같이 대체해야합니다.

    #init.rb 
    ActionDispatch::Callbacks.to_prepare do 
        require_dependency 'issue' 
        Issue.send(:include, RedmineRequireIssueDueDateInFuture::Patches::IssuePatch) 
    end