NoMethodError Sinatra模块化应用程序

时间:2013-06-22 13:23:04

标签: ruby methods sinatra helper

可能是非常基本的东西,但我希望能够在模块化的Sinatra应用程序中使用一些自定义帮助器方法。我在./helpers/aws_helper.rb

中有以下内容
helpers do
 def aws_asset( path )
   File.join settings.asset_host, path
 end
end

然后在我看来我希望能够像这样使用这种方法

<%= image_tag(aws_asset('/assets/images/wd.png')) %>

但是我得到了上面的区域,所以在我的app.rb文件中我是

require './helpers/aws_helper'


class Profile < Sinatra::Base

get '/' do
  erb :index
end

end

我的问题是,我需要在我的Profile类之外。这是没有意义的,因为我要求ENV变量的配置文件以相同的方式正在读取它们,但是再次它们不是方法所以我想这确实有意义。

我想也许我正在努力解决模块化应用程序的问题,而不是使用经典风格的sinatra应用程序。

赞赏任何指针

错误消息

NoMethodError at / undefined method `aws_asset' for #<Profile:0x007f1e6c4905c0> file: index.erb location: block in singletonclass line: 8

1 个答案:

答案 0 :(得分:2)

当你在这个顶层使用helpers do ...时,你将这些方法作为助手添加到Sinatra::Application而不是你的Profile类。如果您只使用Sinatra模块化样式,请确保只使用require 'sinatra/base'而不是require sinatra,这样可以防止您混淆这两种样式。

在这种情况下,您可能应该为助手创建一个模块,而不是使用helpers do ...,然后在Profile类中添加helpers method的模块。

helpers/aws_helper.rb

module MyHelpers # choose a better name of course

  def aws_asset( path )
    File.join settings.asset_host, path
  end
end

app.rb

class Profile < Sinatra::Base

  helpers MyHelpers # include your helpers here

  get '/' do
    erb :index
  end
end