我一直在我的一个项目中尝试 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/