2011-08-03 3 views
0

저는 레일을 처음 사용했습니다. 나는 민첩한 웹 개발 서적을 사용하여 레일을 배우려고 노력했지만, 물론 내 자신의 물건을 시험하고 튜토리얼을 따르지 않아야했다. 레이크 테스트를 할 때 나는 이상한 행동을 계속한다.보기에 nil 속성을 to_s로 변환해야합니까?

내가 얻을 :

test_should_show_experiment(ExperimentsControllerTest): 
ActionView::Template::Error: can't convert nil into String 

test_should_get_index(ExperimentsControllerTest): 
ActionView::Template::Error: undefined method `name' for nil:NilClass 

레이크 테스트를 실행. 내가

<%= image_tag experiment.image_url.to_s, :height => 32, :class => 'list_image' %> 

로 (이미지 태그에 .to_s 추가) 모든 기능 테스트가 성공적임을 변경할 때 내 조회수 (인덱스와 쇼)에서

나는

<%= image_tag experiment.image_url, :height => 32, :class => 'list_image' %> 

를 사용합니다.

내 질문에 : 레일에 가능한 모든 제로 값을 내 경우에 문자열로 변환해야합니까?

이 문제를 해결하는 데 유용 할 수있는 일부 정보 : 내 모델은 다음과 같습니다 발판 명령을 생성 한 후

class Experiment < ActiveRecord::Base 
    validates :name, :description, :image_url, :presence => true 
    validates :name, :uniqueness => true 
    validates :image_url, :format => { 
    #:with => %r{\.(gif|jpg|png)$}i, 
    :with => /\.(gif|jpg|png)$/i, 
    :message => 'must be a URL for GIF, JPG or PNG image.' 
    } 
end 

내가 컨트롤러를 만지지 않았다. 이 곳이다 -

setup do 
    @experiment = experiments(:one) 
    @update = { 
     :name => "JUST SOME UNIT TEST NAME", 
     :description => "JUST SOME UNIT TEST DESCRIPTION", 
     :image_url => "http://www.just-some-unit-test-url.example.com/image.jpg" 
    } 
end 

나는 ' "실험을 업데이트해야합니다"테스트'를 '테스트 ... "실험을 만들어야합니다"'과의 @update를 사용

class CreateExperiments < ActiveRecord::Migration 
    def self.up 
    create_table :experiments do |t| 
     t.string :name 
     t.text :description 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :experiments 
    end 
end 

## another migration file because I wanted to add a column 
class AddImageToExperiments < ActiveRecord::Migration 
    def self.up 
    add_column :experiments, :image_url, :string 
    end 

    def self.down 
    remove_column :experiments, :image_url 
    end 
end 

내 테스트 설정은 다음과 같습니다 오류가 나타납니다.

답변

1

오류 # 1

test_should_show_experiment(ExperimentsControllerTest): 
ActionView::Template::Error: can't convert nil into String 

값을 image_tag 도우미 메서드에 전달할 수 없습니다. 이미지 속성이 nil이면 어쨌든 이미지를 표시하면 안됩니다.을 사용하여 확인하거나 비어있는 속성을 확인한 다음 기본 이미지로 바꿉니다. 정말 아무 것도 사지 않기 때문에 nil.to_s을 사용하지 않는 것이 좋습니다.

<%= image_tag("#{experiment.image_url.blank? ? 'some_default_image.jpg' : experiment.image_url}", :height => 32, :class => 'list_image') %> 

오류 # 2

test_should_get_index(ExperimentsControllerTest): 
ActionView::Template::Error: undefined method `name' for nil:NilClass 

당신의 Experiment 개체가 전무 있음을 말하고 당신은 어떤 당신이 할 수없는 nil의 오브젝트의 name 속성을 (얻기 위해 노력하고 해야 할 것). 실험 개체를 만든 후에 실험 개체가 유효하고 인스턴스 변수 (예 : @experiment)를 .name이라고 부르는 모든보기로 전달한다는 것을 확인하십시오.

0
test_should_get_index(ExperimentsControllerTest): 
ActionView::Template::Error: undefined method `name' for nil:NilClass 

오류가 발생한 위치에 대한 정보가 있어야합니다 (보기를 제공 할 수도 있음).

질문 : 필자의 경우 레일에 모든 가능한 nil 값을 문자열로 변환해야합니까?

예외에주의해야합니다. 가능한 방법은 다음과 같습니다

<%= your_model.name rescue "- no name provided -" %> 

그 이름은 전무있을 수 있습니다 기대 특히 경우 (내가 모델의 빈 이름에 대한 검증이 표시되지 않습니다)