我在我的一个项目中一直在尝试Padrino框架,有一件事让我很烦恼。我想使用OmniAuth实现一个用户注册过程,并希望破坏我的请求处理程序(控制器的操作)以分离方法,如下所示:
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
我知道将逻辑推送到模型层会更好,但我的问题是,我怎么能将控制器逻辑分解为分离的方法并在它们之间共享信息(比如使用实例变量)。在Rails中,我在我的控制器的私有范围内创建了这些方法,但在这里我应该扩展Application类,因为它会抛出前一代码的Undefined方法异常。我试过Helpers,但帮助者不知道实例变量,所以你应该每次传递变量。
在Padrino中使控制器操作清理的好方法是什么?
答案 0 :(得分:11)
要在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,请参阅此答案答案 1 :(得分:-2)
可能是offtopic,但您是否会考虑使用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