4

모델 별 플래시 메시지를 표시하는 부분 뷰가 있습니다. 부분 모양 같은 간단한 정규식을 사용하여 특정 접두어레일즈 - 생산시에만 "심볼을 문자열로 변환 할 수 없습니다"

앱 /보기/mymodel/_flashpartial.erb

<% flash.each do |key, value| %> 
    <% if model_key = myModelFlash(key) then %> 
    <%= content_tag(:div, value, :class => "flash #{model_key}") %> 
    <% end %> 
<% end %> 

myModelFlash 방법은 단순히 취하는 키를 체크한다. 그것은이 내 개발 및 테스트 환경에서 완벽하게 잘 작동

module MyModelHelper 
    def myModelFlash(key) 
    m = /^_mymodel_(.*)/.match(key) 
    m[1] unless m.nil? 
    end 
end 

응용 프로그램/헬퍼/mymodelhelper.rb에 위치하고 있습니다. Heroku에 도착하자마자 (ActionView :: Template :: Error) "Symbol을 String으로 변환 할 수 없습니다"라는 오류 메시지가 나타나 match이라는 호출을 가리 킵니다.

보기에서 myModelFlash에 대한 호출을 제거하고 간단하게 키와 값을 표시하면 오류가 발생하지 않는다는 점에서 문제가 없으므로 키와 값이 부분 뷰에 잘 들어갑니다. . 어떤 이유로 헬퍼 메소드는 전달되는 키가 기호가 아닌 문자열이라고 생각합니다.

왜 이런 일이 벌어지고있는가요?

답변

3

빠른 해결 방법으로 key.to_s을 사용하시기 바랍니다.

문제의 원인은 테스트 서버와 프로덕션 서버간에 일부 구성 요소의 일부 버전이 다를 수 있기 때문입니다. 테스트를 통과하고 프로덕션 환경이 손상된 경우 이는 매우 나쁜 상황입니다.

루비와 사용하고있는 모든 보석의 버전을 비교해야합니다. 'bundler'를 사용하면 'bundle list'가 좋은 요약을 제공합니다.

모든 버전이 동일하다는 것을 알게되면 ... 다른 이유가있을 것입니다.

이 문제는 버전 차이에 의해서도 발생하는 것 같다하지만 분명히 프로덕션 환경에서 테스트에서 다를 수 있습니다 플래시 예기치 않은 데이터로 업데이트.

myModelFlash 방법을 약간 변경하는 것이 좋습니다.

def myModelFlash(key) 
    if m = /^_mymodel_(.*)/.match(key.to_s) 
    return m[1] 
    end 
end 

플래시가 그들 중 일부는 정말 기호 또는 아무것도 할 수있다, 다른 키를 포함 할 수 있습니다, 그래서 당신은 그들 모두를 처리 할 준비를해야합니다.

key 매개 변수를 .to_s으로 변환하는 것이 안전한 선택이어야하지만 항상 플래시 키 (이 "_mymodel"문제와 관련된 키)를 문자열로 설정한다고 확신 할 경우 첫 번째 줄을 변경할 수 있습니다 이 방법의 경우 :

def myModelFlash(key) 
    if key.is_a?(String) && m = /^_mymodel_(.*)/.match(key.to_s) 
    return m[1] 
    end 
end 

테스트에서 플래시에 몇 가지 다른 키를 추가 한 다음 동작에서 처리하는 방법을 테스트합니다.

+0

키를 시도했습니다.to_s를 사용하지만 결과 문자열은 비어있어 일치하지 않습니다. 나는 도우미에게 키를 전달하기 전에 to_s를 시도하고 거기에서 일어나는 일을 보게 될 것이다. –

+0

플래시에 다른 데이터가 들어 있습니다. 프로덕션 서버에서 플래시 내용을 디버그하고 테스트에서이 값을 사용하십시오. 이 경우 문제는 아마 구성 요소의 버전과 관련이 없습니다. – Arsen7

+0

'model_key = myModelFlash (key.to_s)'를 사용하는 것은 언급했듯이 약간의 회피책입니다. 잠시 후 루비/젬 버전을 살펴보고 내가 무엇을 생각해 낼 수 있는지 알아 보겠다. –

관련 문제