我想使用关注点app/controllers/concerns/likeable.rb
和app/models/concerns/likeable.rb
. 第一个用于控制器,第二个用于模型。
如果我创建两个文件,则只加载第一个文件。
解决这个问题的最佳方法是什么?
我想使用关注点app/controllers/concerns/likeable.rb
和app/models/concerns/likeable.rb
. 第一个用于控制器,第二个用于模型。
如果我创建两个文件,则只加载第一个文件。
解决这个问题的最佳方法是什么?
I didn't find a way to use controller and model concerns with the same name without any namespaces.
So, my final solution is to use LikeableModel
and LikeableController
concerns.
我有同样的问题,但我能够通过命名空间控制器和模型问题来解决它。我将所有模型问题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
脚手架的模型部分主要与持久性逻辑有关,你可以Likeable::Persistable
在app/models/concerns/likeable/persistable.rb
.
通过这种方式,您仍然可以将所有喜欢的逻辑保留在单个命名空间中,并针对您的控制器和模型问题进行更具体的处理。
这种方法的好处是,如果您发现需要,例如,需要驻留在lib
目录中以处理特殊计算或其他共享功能的实用程序模块或类,您可以轻松地将其添加到命名空间。在这种情况下,您可以轻松地在 中定义一个Likeable::Utils
模块lib/likeable/utils.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