1

シナトラ/パドリーノでは、ルート内で使用する定数を追加するのに賢明な場所はどこですか?

Padrino を使用して複数のアプリをマウントしているので、定数をすべてのアプリで使用できるようにします。(すべてのアプリは基本クラスから継承します。)

Sinatra.helpersを使用して、ルート内で使用するメソッドを追加しました。

定数についても同様のアプローチを望んでいました。

アップデート

これはスコーピングの問題のようですが、このシナリオで何が問題なのかわかりません。

これは、問題を示す単純な padrino アプリです。

app.rb

class MyProject < Padrino::Application
  register Padrino::Rendering
  register Padrino::Mailer
  register Padrino::Helpers

  MY_CONST = 123
end

controllers.rb

MyProject.controller do
  get "/" do
    p self.class            # => MyProject
    p self.class.constants  # => [:DATA_ATTRIBUTES, ... <snip>..., :MY_CONST, ... <snip>... ]
    p MyProject::MY_CONST   # => 123
    p MY_CONST              # => NameError - uninitialized constant MY_CONST
  end
end
4

2 に答える 2

1

どうやら、Ruby が instance_evaled の proc 内で定数ルックアップを処理する方法に問題があるようです。

エラーを再現する Padrino を使用しない方法を次に示します。

class Thing

  MY_CONST = 123

  def doStuff (&block)
    p "doStuff: #{self.class}"        # => "doStuff: Thing"
    p "doStuff: #{MY_CONST}"          # => "doStuff: 123"

    instance_eval &block
  end

  def doOtherStuff (&block)
    p "doOtherStuff: #{self.class}"   # => "doOtherStuff: Thing"
    p "doOtherStuff: #{MY_CONST}"     # => "doOtherStuff: 123"

    yield 
  end
end

t = Thing.new

t.doStuff do 
  doOtherStuff do
    p self.class             # => Thing
    p self.class.constants   # => [:MY_CONST]
    p Thing::MY_CONST        # => 123
    p MY_CONST               # => NameError: uninitialized constant MY_CONST
  end
end

関連する質問: Ruby 1.9 での instance_eval を使用した定数ルックアップ

関連ブログ投稿: http://jfire.io/blog/2011/01/21/make-sense-of-constant-lookup-in-ruby/

したがって、私のオプションは次のように制限されているようです。

  1. グローバル定数を使用する
  2. 定数を完全に指定します (例: 上記の例では Thing::MY_CONST)。
  3. 代わりにメソッドを使用してください
于 2012-09-24T07:52:31.347 に答える
0

うーん、多分私は理解していませんでしたが、あなたは使うことができますapps.rb

Padrino.configure do
   set :foo, :bar
end

次に、すべてのアプリで変数を取得できるはずです。

または boot または apps.rb に次のようなものを追加します。

MY_CONST = 1
MyConst = 1
于 2012-09-19T15:12:52.540 に答える