首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写gem的lib文件夹中的私有方法

重写gem的lib文件夹中的私有方法
EN

Stack Overflow用户
提问于 2015-11-08 16:50:27
回答 2查看 3.8K关注 0票数 6

spree-auth-devise gem中有一个私有方法。该方法位于控制器UserSessionsController https://github.com/spree/spree_auth_devise/blob/master/lib/controllers/frontend/spree/user_sessions_controller.rb内部。

我希望覆盖函数"redirect_back_or_default“。

这个是可能的吗?

更新

在混合和匹配你的答案并做了一些谷歌搜索之后,我得出了这个解决方案:

代码语言:javascript
复制
    Spree::UserSessionsController.class_eval do
        private
        def redirect_back_or_default(default)
          if default == "/admin/orders" or session["spree_user_return_to"] == "/admin/orders"
            redirect_to("/admin/users")
          else
            redirect_to(session["spree_user_return_to"] || default)
          end
            session["spree_user_return_to"] = nil
        end
    end

并且我已经将脚本文件放在config/initializers中。

谢谢你们所有人。

EN

回答 2

Stack Overflow用户

发布于 2015-11-08 17:23:44

你可以这样做:

代码语言:javascript
复制
class HelloWorld
  def run
    say_hello_world
  end

  private 
    def say_hello_world
      puts "hello world"
    end
end

HelloWorld.new.run 
"hello world"
=> nil

现在让我们扩展/覆盖当前行为。

代码语言:javascript
复制
class HelloWorld 
  private
    def say_hello_world
      puts "Goodbye"
    end 
end

HelloWorld.new.run
"Goodbye"
=> nil

因此,既然这是可行的,不如让猴子来修补它吧。如下所示:

代码语言:javascript
复制
class Spree::UserSessionsController < Devise::SessionsController
  private
    def redirect_back_or_default(default)
      # your logic
    end
end
票数 4
EN

Stack Overflow用户

发布于 2015-11-08 18:54:32

当然,您可以覆盖私有方法:

代码语言:javascript
复制
class Super
  private def i_am_private
    'private method'
  end
end

class Sub < Super
  private def i_am_private
    'overridden ' << super
  end
end

Sub.new.send(:i_am_private)
# => 'overridden private method'
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33592221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档