我是一个相当新的RoR。我花了一个下午的时间阅读模块(用作关注点)。我还没有找到一篇好的文章,描述了使用include
或extend
方法查找的文件路径(如果include
和extend
是方法?).
我发现的最具体的例子是这里:Ruby On Rails - Using concerns in controllers。这让我觉得如果我想在我的Foo
模型中包含'Bar'模块,我会在我的models/
目录中创建一个concerns/
目录,并在这个文件夹中创建一个'Bar'模块文件。
# in models/concerns/bar.rb
modlue Bar
# do I need this???
extend ActiveSupport::Concern
def speak_bar
puts "model module bar!"
end
end
# in models/foo.rb
class Foo < ApplicationRecord
include Bar
end
# I could then perform:
Foo.new.speak_bar
=> "model module bar!"
如果我想在我的Foo控制器中包含一个Bar模块,我会这样做:
# in controllers/concerns/bar.rb
modlue Bar
# Again, do I need this???
extend ActiveSupport::Concern
def speak_bar
return "controller module bar!"
end
end
# in controllers/foo.rb
class FoosController < ApplicationController
include Bar
def make_bar
@bar = speak_bar
end
end
# I could then use @bar in my views (anywhere else?) as <%= @bar %> and get it to output
=> "controller module bar!"
问题摘要:
就文件路径而言,上述理解是否正确?
我需要使用extend ActiveSupport::Concern
线才能使用这个路径系统吗?include
和extend
是什么方法?
谢谢你的帮助。
3条答案
按热度按时间thigvfpy1#
您应该始终使用Rails提供的关注点库来扩展您的关注点模块。
对于模型关注点,路径通常是
app/models/concerns/file.rb
,对于控制器,路径通常是app/controllers/concerns/file.rb
,等等。如果您有跨越控制器和模型分离的逻辑,请考虑将其放置在
lib
中,并将lib添加到您的自动加载路径中。include
和extend
是方法。大多数东西(几乎所有)都是ruby中的对象。所以几乎所有的操作都是对象上的方法。vyswwuz22#
the file path that using include or extend
Rails在开始自动加载很多东西时会有一些魔力,所以当你调用“Bar”时不必担心。这个演讲对于理解为什么你可以在rails模型中直接做include Bar
而不需要太多思考https://www.youtube.com/watch?v=I0a5zv7uBHw非常有帮助通常,你希望模型相关的关注点在/app/models/concerns中,控制器相关的关注点在/app/controllers/concerns中,但这只是为了组织的目的,即使你使用/app/whatever/concerns,rails也会自动加载它们,所以要小心名称冲突。
如果您想使用Concerns提供的语法糖,您确实需要扩展
ActiveSupport::Concern
,但最终它们只是可以包含的模块。https://api.rubyonrails.org/classes/ActiveSupport/Concern.html检查这个例子,关注点只是一种编写模块的方式,以共享行为,具有更友好的语法,用于公共轨道模式。extend
是Object www.example.com的方法https://docs.ruby-lang.org/en/2.6.0/Object.html#method-i-extendinclude
是Module www.example.com的方法https://docs.ruby-lang.org/en/2.6.0/Module.html#method-i-include(Module从Object继承extend
)4bbkushb3#
默认情况下,从
rails v4+
开始,rails自动加载concerns
。您可以阅读DHH编写的article,以了解Concern的作用以及它试图解决的问题。但是,在确定方法中的
scope
和self
是什么时会变得非常复杂。看看Ryan Bates写的关于concerns
问题的video。为了解决问题的某些部分,我通常将关注点嵌套在一个文件夹中,并通过提供
class
来引用它。举个例子并包含在
model
中,如在我看来,关注点的分离有助于隔离您的方法。例如,可以用类似的方法创建一个
Filterable
concern
,并将其与其他models
隔离。