2011-08-03 21 views
0

私はレールが初めてですので、このことについて私にご負担ください。私は、アジャイルWeb開発の本を使ってレールを習うように努力しています。もちろん、自分のものを試して、チュートリアルに従わなくてはなりませんでした。レーキテストを実行すると、私は奇妙な振る舞いで立ち往生しています。ビューの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 

すくいテストを実行しています。私の意見(インデックスおよびshow)で

私は

<%= 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 

私はコントローラに触れませんでした。

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 

私のテストのセットアップは次のようになります。

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を使用「テスト 『の実験を作成する必要がありますが、』 ...」と「テストは 『実験を更新する必要があり、』」 - これがありますエラーが表示されているようです。

答えて

1

エラー#1

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

ゼロの値をimage_tagヘルパーメソッドに渡すことはできません。 image属性がnilの場合は、イメージを表示しないでください。 blank?を使用してチェックします。これは、空または空の属性をチェックして、何らかの種類のデフォルトイメージで置き換えます。私は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 

エラーが発生した場所に関する情報が必要です(おそらく表示してください)。

質問:私のケースでは、レールですべての可能なゼロ値を文字列にキャストする必要がありますか?

例外を気にする必要があります。可能な方法は次のとおりです。

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

あなたはその名前がnilかもしれ期待する場合は特に(私はあなたのモデルに空白の名前の検証が表示されていない)

関連する問題