4

我一直在我的一个项目中尝试 Padrino 框架,但有一件事让我非常恼火。例如,我想使用 OmniAuth 实现一个用户注册过程,并希望将我的请求处理程序(控制器的操作)分解为单独的方法,如下所示:

获取 ":provider/callback" 做
  @user = find_the_user_by_oauth(请求)
  create_user 除非@user
  store_user_in_session
结尾

def find_the_user_by_oauth(请求)
  #...
结尾

def store_user_in_session
  会话[:user_id] = @user.id
结尾

我知道将逻辑推送到模型层会更好,但我的问题是,我如何将控制器逻辑分解为分离的方法并在它们之间共享信息(例如使用实例变量)。在 Rails 中,我在控制器的私有范围内创建了这些方法,但在这里我应该扩展 Application 类,因为它会为前面的代码抛出未定义的方法异常。我尝试了 Helpers,但 helpers 不知道实例变量,所以你应该每次都传递变量。

在Padrino中使我的控制器动作干净的好方法是什么?

4

2 回答 2

12

要在 Padrino 控制器中定义方法,您可以使用define_method而不是def

对于您的示例,请执行以下操作:

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 的块。请参阅此答案以了解define_method 和 def 之间的差异https://stackoverflow.com/a/3171649

于 2013-02-21T10:08:59.033 回答
-2

可能是题外话,但您会考虑改用Espresso 框架

那么你就可以像这样简单地解决你的问题:

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 回答