ruby - Padrino Controller 抽象

标签 ruby padrino

我一直在我的一个项目中尝试 Padrino 框架,有一件事让我很恼火。例如,我只想使用 OmniAuth 实现用户注册过程,并想打破我的请求处理程序( Controller 的操作)以分离方法,如下所示:

get ":provider/callback" do
  @user = find_the_user_by_oauth(request)
  create_user unless @user
  store_user_in_session
end

def find_the_user_by_oauth(request)
  #...
end

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

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

在 Padrino 中让我的 Controller 操作干净的好方法是什么?

最佳答案

要在 Padrino Controller 中定义一个方法,您可以使用 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 的 block 。 有关差异,请参阅此答案 https://stackoverflow.com/a/3171649在 define_method 和 def 之间

关于ruby - Padrino Controller 抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331006/

相关文章:

ruby - ActiveRecord Update_all 为变量值

javascript - 将 HTML 代码转换为 Javascript 变量(字符串)

ruby - 如何使用 Padrino 渲染图像?

ruby - 使用 Padrino 表单助手和表单生成器 - 入门

ruby - 无法通过 Sequel 连接到 Postgres

ruby - 如何并行启动 Ruby 命令

Ruby 删除可枚举列表中的重复项

ruby - 如何避免查询结果中出现重复的字段名

ruby - 使用 RSpec 我如何测试救援异常 block 的结果

rspec - 如何在 rspec 中使用 padrino 辅助方法