4

私は自分のプロジェクトの 1 つで Padrino フレームワークを試してきましたが、本当に悩ましいことが 1 つあります。たとえば、OmniAuth を使用してユーザー登録プロセスを実装し、リクエスト ハンドラー (コントローラーのアクション) を分割して、次のようにメソッドを分離したいと考えています。

get ":provider/callback" do
  @user = find_the_user_by_oauth(リクエスト)
  @userでない限りcreate_user
  store_user_in_session
終わり

def find_the_user_by_oauth(リクエスト)
  #...
終わり

def store_user_in_session
  session[:user_id] = @user.id
終わり

ロジックをモデルレイヤーにプッシュする方が良いことはわかっていますが、私の質問は、コントローラーロジックを分割してメソッドを分離し、それらの間で情報を共有するにはどうすればよいか (インスタンス変数を使用するなど) です。Rails では、コントローラーのプライベート スコープでこれらのメソッドを作成しましたが、ここでは Application クラスを拡張する必要があります。これは、前のコードに対して未定義のメソッド例外がスローされるためです。ヘルパーを試してみましたが、ヘルパーはインスタンス変数を知らないので、毎回変数を渡す必要があります。

Padrino でコントローラーのアクションをクリーンにする良い方法は何ですか?

4

2 に答える 2

12

Padrino コントローラー内でメソッドを定義するには、 defの代わりにdefine_methodを使用できます。

あなたの例では、次のようにします。

Admin.controllers :dummy do

  define_method :find_the_user_by_oauth do |request|
    request.params["username"]
    # ...
  end

  define_method :store_user_in_session do
    session[:user_id] = @user
  end

  get :test do
    @user = find_the_user_by_oauth(request)
    create_user unless @user
    store_user_in_session()
    session.inspect
  end

end

Padrino は、instance_eval を使用して Admin.controllers に送信されたブロックを実行します。https://stackoverflow.com/a/3171649 define_method と defの違いについては、この回答を参照してください

于 2013-02-21T10:08:59.033 に答える
-2

トピック外の可能性がありますが、代わりにEspresso Frameworkを使用することを検討してください。

次に、次のように簡単に問題を解決できます。

class App < E

  def index provider, action = 'callback'
    @user = find_the_user_by_oauth
    create_user unless @user
    store_user_in_session
  end

  private

  def find_the_user_by_oauth
    # provider, action are accessed via `action_params`
    # action_params[:provider]
    # action_params[:action]
  end

  def store_user_in_session
    session[:user_id] = @user.id
  end

end
于 2012-11-11T12:39:13.293 に答える