- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我需要重写 Ruby on Rails 中的许多路径辅助方法并从中调用 super。我的标准方法是:
path_helper.rb
def business_path(business)
if params[:city_id] == 2
moscow_business_path(business)
else
super
end
end
但是我有很多这样的方法,所以我想像这样动态地定义它们:
%i[root businesses business ...].each do |path_method|
method_name = "#{path_method}_path"
old_method = method(method_name)
define_method(method_name) do |*args|
if params[:city_id] == 2
public_send("moscow_#{method_name}")
else
old_method.call(*args)
end
end
end
但是我得到这个错误:
/home/leemour/Ruby/burobiz/app/helpers/path_helper.rb:31:in `method': undefined method `root_path' for class `Module' (NameError)
from /home/leemour/Ruby/burobiz/app/helpers/path_helper.rb:31:in `block in <module:PathHelper>'
from /home/leemour/Ruby/burobiz/app/helpers/path_helper.rb:29:in `each'
from /home/leemour/Ruby/burobiz/app/helpers/path_helper.rb:29:in `<module:PathHelper>'
from /home/leemour/Ruby/burobiz/app/helpers/path_helper.rb:1:in `<top (required)>'
from /home/leemour/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.1.3/lib/active_support/dependencies.rb:476:in `load'
我猜还没有包含辅助模块,所以没有原始路径辅助方法可以用 method(method_name)
捕获。然后我想我必须使用 self.included
钩子(Hook),但我想不出来。我如何调整此代码以使其工作? (我不想使用 eval)。
最佳答案
您是否尝试过使用 Rails.application.routes.url_helpers
方法,而不是尝试使用 Kernel.method
?
%i[...].each do |path_method|
define_method("#{path_method}_path") do |*args|
if params[:city_id] == 2
public_send("moscow_#{path_method}_path", *args)
else
Rails.application.routes.url_helpers.public_send("#{path_method}_path", *arsg)
end
end
end
关于ruby-on-rails - 使用 define_method 覆盖 Rails 中的路径助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50494898/
谁能详细说明ruby的Object#define_method和Module#define_method之间的区别以及它们通常用在什么地方? 最佳答案 对象#define_method 不存在: o
Ruby 中的元编程很棒,因为我经常使用它来模拟基于原型(prototype)的编程,并快速编写一些问题的原型(prototype)解决方案来测试它们的可行性。所以我想知道下面这段代码是否有本质区别:
我必须通过以下测试: def test_can_find_by_arbitrary_fields assert @library.respond_to? :find_by_artist ass
在下面的代码中,模块被扩展,这意味着方法 hash_initialized 被视为类方法,或 eigen 类的实例方法。这是我们需要的,因为 hash_initialized 是在本征类的上下文中调用
我是 ruby 的新手,但我有很多重复的方法。在尝试 DRY 我的代码时,我想到了如下内容: class Foobar def some_method # end def so
所以我正在尝试这段代码, class Colors def initialize color color.each {|c| color c} end def color c
我有很多方法完全相同,但需要为每个方法定义一个特定的名称。因此,我在调用每个单独的 format_ 方法的方法中尝试了以下操作: ['street', 'postcode', 'email', 'ty
define_method 表现出以下行为: class TestClass def exec_block(&block) ; yield ; end end TestClass.new.send
我正在阅读 Ruby 中的元编程。 这是书中的两个代码片段: my_var = "Success" MyClass = Class.new do puts "#{my_var} in the cl
我遇到了以下代码: class MethodLogger def log_method((klass,method_name) klass.class_eval do
我想定义一个接受关键字参数的方法。我希望它在未提供关键字参数时引发,我可以自己编写代码 - 但理想情况下我想让 Ruby 为我做这件事。此外,我希望能够使用 Method#parameters 检查新
有没有办法在YardDoc 中注释用define_method 定义的方法? ? 我试过这个: %w(one two three).each do |type| # The #{type} way
我想将参数传递给使用 define_method 定义的方法,我该怎么做? 最佳答案 传递给 define_method 的 block 可以包含一些参数。这就是您定义的方法接受参数的方式。当你定义一
我想为 Python 类动态定义一些方法。我用谷歌搜索了一会儿,找到了 this .我稍微更改了代码以满足我的要求。 这是我的代码: class Base(object): def add_met
三天来我一直在反对这个问题。我创建了一个模拟 html 页面的类,并告诉 cucumber 步骤定义在哪里填充表单数据: class FlightSearchPage def initialize
所以,我有点想做一些类似于 rspec/mocha 的 mock 的事情。 ,但仅适用于两个对象,而不是所有对象。这是我目前所拥有的: def mock(obj, method_to_mock, va
我在 ruby 中有这段代码: class Package def initialize(name) @name = name @elements = [] end [:type,
当我在 instance_eval block 中为类定义一个方法时,它会创建一个很好的类方法。 例如) class A end A.instance_eval do def method; en
class Temp1 def add(s) match = 'test' self.class.class_eval do define_method(s) do
这就是我想要做的。 # DSL Commands command :foo, :name, :age command :bar, :name # Defines methods def foo(nam
我是一名优秀的程序员,十分优秀!