我是否需要为视图转换nil属性to_s

时间:2011-08-03 22:04:32

标签: ruby-on-rails ruby

我是铁杆新手,所以请耐心等待。我尝试使用敏捷的Web开发书来学习rails,当然不得不尝试我自己的东西,而不是按照教程。虽然我在运行rake测试时遇到了一种奇怪的行为。

我明白了:

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

运行rake测试时。

在我的观点(索引和节目)中,我使用

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

当我将其改为

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

(将.to_s添加到图像标记)所有功能测试都成功。

现在我的问题:在我的情况下,rails是否要求我将每个可能的nil值转换为字符串?

可能有助于解决此问题的一些信息: 我的模型看起来像这样:

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

生成scaffold命令后,我没有触摸控制器。

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

我在'test'中使用@update应该创建实验“...”和'test'应该更新实验“' - 这就是错误似乎出现的地方。

2 个答案:

答案 0 :(得分:1)

错误#1

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

您无法将 nil 值传递给image_tag辅助方法。如果图像属性为零,则无论如何都不应显示图像。使用检查nil或empty属性的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 并且您正在尝试获取nil对象的name属性(您无法做到)。确保您的实验对象在创建后有效,并且您将实例变量(即@experiment)传递到您在其上调用.name的任何视图

答案 1 :(得分:0)

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

您应该了解错误发生的位置(请提供一个视图)。

问题:在我的情况下,rails是否要求我将每个可能的nil值转换为字符串?

你应该关心例外。可能的方法是:

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

特别是如果您希望该名称可能为零(我在模型中看不到空白名称的验证)