在Ruby on Rails项目中,在哪里存储“关注点”?(Rails 5.2+)

lmyy7pcs  于 2023-05-17  发布在  Ruby
关注(0)|答案(3)|浏览(163)

我是一个相当新的RoR。我花了一个下午的时间阅读模块(用作关注点)。我还没有找到一篇好的文章,描述了使用includeextend方法查找的文件路径(如果includeextend是方法?).
我发现的最具体的例子是这里: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线才能使用这个路径系统吗?
includeextend是什么方法?
谢谢你的帮助。

thigvfpy

thigvfpy1#

您应该始终使用Rails提供的关注点库来扩展您的关注点模块。
对于模型关注点,路径通常是app/models/concerns/file.rb,对于控制器,路径通常是app/controllers/concerns/file.rb,等等。
如果您有跨越控制器和模型分离的逻辑,请考虑将其放置在lib中,并将lib添加到您的自动加载路径中。
includeextend是方法。大多数东西(几乎所有)都是ruby中的对象。所以几乎所有的操作都是对象上的方法。

vyswwuz2

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

4bbkushb

4bbkushb3#

默认情况下,从rails v4+开始,rails自动加载concerns。您可以阅读DHH编写的article,以了解Concern的作用以及它试图解决的问题。
但是,在确定方法中的scopeself是什么时会变得非常复杂。看看Ryan Bates写的关于concerns问题的video
为了解决问题的某些部分,我通常将关注点嵌套在一个文件夹中,并通过提供class来引用它。举个例子

# app/models/concerns/user/authentication.rb

class User
  module Authentication
    extend ActiveSupport::Concern
    # stuff
  end
end

并包含在model中,如

# app/models/user.rb

include Authentication

在我看来,关注点的分离有助于隔离您的方法。例如,可以用类似的方法创建一个Filterableconcern,并将其与其他models隔离。

相关问题