我是铁杆新手,所以请耐心等待。我尝试使用敏捷的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'应该更新实验“' - 这就是错误似乎出现的地方。
答案 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 -" %>
特别是如果您希望该名称可能为零(我在模型中看不到空白名称的验证)