如何使用 Rails3.2.6 的send_data在浏览器中显示图像活动记录?



SO中有几个关于send_data的问题,但答案无法解决我的问题。

我正在练习第21章关于使用Rails4进行敏捷Web开发的观点,当使用send_data在浏览器中显示图像Active Record时,我没有得到p351的结果,而是在Development.log中出现了一个与send_data相关的错误:

NoMethodError (undefined method `data' for nil:NilClass):
app/controllers/pictures_controller.rb:17:in `picture'

但是,我可以用相同的data通过send_file得到正确的结果。

我完成的事情如下:(1) 我的环境是:ruby-1.9.3,rails 3.2.6(2) 表文件:app/db/migrate/xxx_create_pictures.rb

 create_table :pictures do |t|
    t.string :name
    t.string :content_type
    t.binary :data
 end

这里,t.binary :data用于存储图像的数据(3) 控制器文件:app/controllers/pictures_controller.rb:

def picture
   @picture = Picture.find(params[:id])
   send_data(@pciture.data,
          filename: @picture.name,
          type: @picture.content_type,
          disposition: "inline")
end

(4) 访问http://localhost:3000/pictures/1时,浏览器中可以显示文件名和类型,但不能显示图像,并出现错误如上所述。此外,如果我按如下方式使用send_file,则可以显示图像:

file = "my_file.png"
File.open(file, "wb"){ |f| f << @picture.data }
send_file( file, :type => 'image/png' )

当然,send_file有一个不愉快的结果,它将保存一个不必要的文件my_file.png

我不知道我为什么想念什么?任何建议都将不胜感激!

编辑:很抱歉问这样一个问题。正如@Deep所说,我写错了一个单词pciture

undefined method 'data' for nil:NilClass总是意味着它正在尝试执行nil.data,这不是为nil定义的方法。所以它抛出了这个错误。我在社区中看到许多用户发布了这个错误。因此,这只是意味着,由于某种原因,您试图在其上使用该方法的对象是nil。因此,首先检查它为什么是nil。可能有一些原因,比如打字错误或发现了一些错误的值或其他什么。你的问题的答案是纠正一个拼写错误:

send_data(@pciture.data

send_data(@picture.data

最新更新