如何使用同名的两个关注点?
How to use two concerns with the same name?
我想使用关注点 app/controllers/concerns/likeable.rb
和 app/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
我没有找到在没有任何名称空间的情况下使用同名控制器和模型关注点的方法。
所以,我最终的解决方案是使用 LikeableModel
和 LikeableController
关注点。
我遇到了同样的问题,但我能够通过为控制器和模型问题命名空间来解决它。我将所有模型问题移至 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
模块,或者根据需要定义类似的东西,并且一切都将存在于那个一致的命名空间下。
我想使用关注点 app/controllers/concerns/likeable.rb
和 app/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
我没有找到在没有任何名称空间的情况下使用同名控制器和模型关注点的方法。
所以,我最终的解决方案是使用 LikeableModel
和 LikeableController
关注点。
我遇到了同样的问题,但我能够通过为控制器和模型问题命名空间来解决它。我将所有模型问题移至 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
模块,或者根据需要定义类似的东西,并且一切都将存在于那个一致的命名空间下。