1

私は、sinatra を使用してかなり単純なサイトを書き始めたところです。私の問題は、メインの app.rb ファイルをリファクタリングしたかったのですが、url パラメーターにアクセスしようとするとエラーが発生することです。

私の get '/' アクションでは、Sinatra はどのパラメーターが設定されているかを調べてから、URL の内容に応じていくつかの異なることを行う必要があります。このようなもの。

class App < Sinatra::Application
  ...
  get '/' do
    if params['code1']
      @network = 'code1'
      mode code here
    elsif params['called'] && params['mac']
      @network = 'code2'
      mode code here
    elsif params['code3']
      @network = 'code3'
      mode code here
    end  
  end      

問題は、params も使用するファイルを要求する必要があることです。

上記のコードに以下を入れました。

require File.dirname(__FILE__) + '/lib/networks/code1.rb'

code1.rb には以下が含まれます。

class App < Sinatra::Application
  if params['login']  # == 'login'
    pass = 'uampass'
  elsif
  ...

しかし、それは私に次のエラーを与えます:

undefined local variable or method `params' for main:Object

エラーを発生させずにこれをリファクタリングするにはどうすればよいですか

4

2 に答える 2

2

私の知る限り、1 つのアプリケーションで 2 つ (またはそれ以上) の Sinatra アプリケーションを使用することはできません。両方のファイルがSinatra::Application子孫を定義しているため、これは不可能です。

また、params-hash の値を使用する場合は、ルートを処理するときに呼び出すヘルパー メソッドHelper Documentationを定義するか、パラメータとして params-value を取るクラス メソッドまたはインスタンス メソッドを持つ Class を作成する必要があります。実際に別のファイル/クラスからパラメーターを呼び出すことは、良い習慣とは思えません。

これを文脈で説明すると、Sinatra アプリケーションはハンドラーとして編成されます。Sinatra::Application子孫は、サポートメソッド (ヘルパーおよび子孫のインスタンス メソッド) またはサポートクラスを使用するメインハンドラーのようなものです。これらは通常、他のファイルで定義されますが、.Sinatra::ApplicationSinatra::Application

これをもう少し明確にするために:

メインのSinatraファイル:

require_relative 'another_file.rb'
class App < Sinatra::Application
  # ...
  @a_handler = MyHandler.new
  get '/' do

    if params['something'] == 'wanted_value'
      @a_handler.handle_it(params)
    end

end

別のファイル ('another_file.rb'):

class MyHandler
  def initialize
    @an_instance_variable = 'foobar'
  end
  def handle_it(params_hash)
    if params_hash['login']  # == 'login'
      pass = 'uampass'
    elsif
     # ...
    end
    # ...
    # do some stuff
    # ....
    return pass
  end
end

もちろん、実際のコードは、解決しようとしている実際の問題に依存するため、詳しく説明すると、より正確になる可能性があります...

于 2012-07-04T18:30:16.043 に答える
-1

エラーメッセージには、知っておく必要のあるすべてのものが含まれており、Sinatraとは関係ありません。

これを含むcode1.rbが必要です(実行されるように少し編集されています)。

require 'sinatra'

class App < Sinatra::Application
  if params['login']  # == 'login'
    pass = 'uampass'
  end
end

Rubyは、コードに遭遇するとコードを評価します。この場合、「code1.rb」が必要なので、そのファイルのコードが評価されます。'params'に遭遇し、「その名前のローカル変数またはメソッドはありますか?」と尋ねます。ないので、あなたが見てきたように失敗します。irbセッションを開いてチェックしてください。

rubyのクラス定義は、スコープを持つ単なる式です。

Sinatraに関連して:paramsは、ルート宣言が取るブロックで使用できます。

Sinatra:Up and Runningを読むことをお勧めします。これは、進行中の「魔法」のいくつかを説明しています(Sinatra Bookの優れたコンパニオン)。

于 2012-07-04T20:04:13.040 に答える