【问题标题】:Adding file uploads to a Sinatra tutorial将文件上传添加到 Sinatra 教程
【发布时间】:2011-10-04 17:04:36
【问题描述】:

编辑 - 'carrierwave' 不适用于 Sinatra 1.3。 Sinatra 1.2.7 震撼了这段代码!


我正在学习 Ruby,并且刚刚完成了这个很棒的 Sinatra 教程: http://net.tutsplus.com/tutorials/ruby/singing-with-sinatra-the-encore/

完整的工作代码在这里(没有 Bundler,所以需要安装几个 gem) http://nettuts.s3.amazonaws.com/953_sinatra3/Source.zip

我感觉很好,我想了解更多!我为自己设置的下一个挑战是在该教程中添加文件上传功能,我很难过。我想使用 Carrierwave,并尝试将其集成到已完成的教程中。

首先,我需要“carrierwave”和“carrierwave-datamapper”:

require 'carrierwave'
require 'carrierwave/datamapper'

然后我正在创建一个新类:

class MyUploader < CarrierWave::Uploader::Base    #via a Carrierwave tutorial
  storage :file
end

添加到笔记类:

class Note
include DataMapper::Resource
property :id, Serial
property :content, Text, :required => true
property :complete, Boolean, :required => true, :default => 0
property :created_at, DateTime
property :updated_at, DateTime
property :image, String, :auto_validation => false  # trying to add image uploading
mount_uploader :image, MyUploader                   # trying to add image uploading
end

添加到帖子:

post '/' do
  n = Note.new
  n.content = params[:content]
  n.image = params[:image]      # trying to add image uploading
  n.created_at = Time.now
  n.updated_at = Time.now
  n.upload = 
  if n.save 
    redirect '/', :notice => 'Note created successfully.'
  else
    redirect '/', :error => 'Failed to save note.'
  end
end

最后,我正在向表单添加上传:

<section id="add">
<form action="/" method="post" enctype="multipart/form-data">
    <textarea name="content" placeholder="Your note&hellip;"></textarea>
    <p><input type="file" name="image" /></p>
    <input type="submit" value="Take Note!">
</form>
</section>

我收到此错误:

/gems/carrierwave-0.5.7/lib/carrierwave.rb:107:in `<top (required)>': private method `public' called for Sinatra::Application:Class (NoMethodError)

当然,如果我不需要“carrierwave”,当 MyUploader 尝试从它继承时我会收到错误...

提前感谢您提供的任何提示。我觉得这里很近,但又很远!

【问题讨论】:

    标签: sinatra carrierwave


    【解决方案1】:

    此错误似乎是由最近对 sinatra 的更改引起的。这是在changelog for version 1.3

    :public 重命名为 :public_folder 以避免覆盖 Ruby 的内置 public 方法/关键字。 set(:public, ...) 仍然可以使用,但会显示警告。 (康斯坦丁·哈斯)

    要么检查是否有更新版本的carrierwave,要么使用以前版本的sinatra。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 2011-02-10
      • 2012-12-30
      • 2012-06-06
      • 1970-01-01
      相关资源
      最近更新 更多