如何使用同名的两个关注点?

How to use two concerns with the same name?

我想使用关注点 app/controllers/concerns/likeable.rbapp/models/concerns/likeable.rb。 第一个用于控制器,第二个用于模型。

如果我创建两个文件,只有第一个被加载。

解决这个问题的最佳方法是什么?

您可以使用 namespace 区分同名的两个问题 以下是例子

app/controllers/concerns/like/likeable.rb
module Like
   class Likeable
     # do some stuff here
   end
end

app/models/concerns/likeable.rb
class Likeable
  # do some stuff here
end

我没有找到在没有任何名称空间的情况下使用同名控制器和模型关注点的方法。
所以,我最终的解决方案是使用 LikeableModelLikeableController 关注点。

我遇到了同样的问题,但我能够通过为控制器和模型问题命名空间来解决它。我将所有模型问题移至 app/models/concerns/models/,并将所有控制器问题移至 app/controllers/concerns/controllers/。有了这个,就可以有同名的模型和控制器问题。

app/models/concerns/models/likeable.rb
module Models::Likeable

end

app/controllers/concerns/controllers/likeable.rb
module Controllers::Likeable

end

顾虑可以这样写;

class Post < ActiveRecord::Base
  include Models::Likeable
end
class PostsController < ApplicationController
  include Controllers::Likeable
end

较早的问题,但我想我会提出另一个我认为更符合 Rails 约定的选项。 Likeable 命名空间负责处理任何喜欢的项目,并且有一些控制器需要处理对喜欢的资源的构建响应,以及那些喜欢的资源的模型。这两者都可以实现 Likeable 概念的各个方面。需要的是在不同职责的命名空间内进行细分。

在这种情况下,我要做的是在 app/controllers/concerns/likeable/respondable.rb 中创建一个文件,该文件实现控制器提供的 Likeable::Respondable 功能。 (你可能会找到一个比 Respondable 更好的名字来满足你的需要——例如,如果控制器关注点只真正处理一些围绕参数的逻辑,你可以称它为 Likeable::Paramable,等等)

同样,如果您的 Likeable 脚手架的模型端必须主要处理持久性逻辑,您可以在 app/models/concerns/likeable/persistable.rb.

中定义一个 Likeable::Persistable 模块

通过这种方式,您仍然可以在单个命名空间中保留所有喜欢对象的逻辑,并更加具体地处理您的控制器和模型问题。

这种方法的优点在于,如果您发现需要实用程序模块或需要位于 lib 目录中的 class,您可以稍后轻松添加到命名空间用于处理特殊计算或其他共享功能。在这种情况下,您可以轻松地在 lib/likeable/utils.rb 中定义一个 Likeable::Utils 模块,或者根据需要定义类似的东西,并且一切都将存在于那个一致的命名空间下。