5

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

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

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

4

4 回答 4

3

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.

于 2017-03-12T22:27:22.930 回答
2

我有同样的问题,但我能够通过命名空间控制器和模型问题来解决它。我将所有模型问题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

于 2019-08-14T14:48:07.567 回答
1

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

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

同样,如果你的Likeable脚手架的模型部分主要与持久性逻辑有关,你可以Likeable::Persistableapp/models/concerns/likeable/persistable.rb.

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

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

于 2020-09-23T13:03:53.120 回答
0

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
于 2017-02-27T08:02:45.667 回答