2015-02-10 2 views
1

Я создал простое приложение Sinatra на основе this excellent SO answer. Мой код работает и выглядит следующим образом:Вызов вспомогательного метода из маршрута в Sinatra

# app.rb 
require 'sinatra' 

class MyApp < Sinatra::Application 

    set :public_folder, Proc.new { File.join(root, "app/public") } 
    set :views, Proc.new { File.join(root, "app/views") } 

    register Sinatra::Namespace 
    register Sinatra::Flash 
    enable :sessions 

end 

require_relative 'app/helpers/init' 
require_relative 'app/models/init' 
require_relative 'app/routes/init' 

Тогда я грязный загрузчик изображений в качестве помощника, который в настоящее время требуется в app/helpers/init.rb

# app/helpers/image.rb 
require 'imgur' 

module ImageUploader 

    def save(image) 
    @filename = image[:filename] 
    file = image[:tempfile] 
    File.open("#{ENV['PHOTO_TMP_DIR']}/#{@filename}", 'wb') do |f| 
     f.write(file.read) 
     upload(@filename) 
    end 
    end 

    def upload(filename) 
    client = Imgur.new(ENV['IMGUR_CLIENT_ID']) 
    image = Imgur::LocalImage.new("#{ENV['PHOTO_TMP_DIR']}/#{@filename}") 
    uploaded = client.upload(image) 
    File.delete("#{ENV['PHOTO_TMP_DIR']}/#{@filename}") 
    uploaded.link 
    end 

end 

И я успешно вызов save метода в мой app/routes/admin.rb файл, например так:

# app/routes/admin.rb 
class MyApp < Sinatra::Application 
    ... 
    imgur_url = save(params[:image]) 
    ... 
end 

проблема заключается в том, что save имя метода является настолько универсальным. Я пробовал звонить с ImageUploader::save и ImageUploader.save, но они оба бросают ошибки. Есть ли другой способ, которым я могу назвать этот вспомогательный метод и присвоить его имена вспомогательному модулю?

Я должен отметить, что я загружаю вспомогательный метод как это:

# app/helpers/init.rb 
require_relative 'image' 
MyApp.helpers ImageUploader 

ответ

1

Фигурные это! Чтобы пропустить пространства имен модулей, поставьте self перед именем метода. Теперь делаем:

# app/helpers/image.rb 
require 'imgur' 

module ImageUploader 

    def self.save(image) 
    @filename = image[:filename] 
    file = image[:tempfile] 
    File.open("#{ENV['PHOTO_TMP_DIR']}/#{@filename}", 'wb') do |f| 
     f.write(file.read) 
     upload(@filename) 
    end 
    end 

    def self.upload(filename) 
    client = Imgur.new(ENV['IMGUR_CLIENT_ID']) 
    image = Imgur::LocalImage.new("#{ENV['PHOTO_TMP_DIR']}/#{@filename}") 
    uploaded = client.upload(image) 
    File.delete("#{ENV['PHOTO_TMP_DIR']}/#{@filename}") 
    uploaded.link 
    end 

end 

Позволяет мне звонить ImageUploader.save без каких-либо ошибок.