如何使用同名的两个问题?

时间:2017-02-27 07:52:36

标签: ruby-on-rails activesupport-concern

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

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

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

4 个答案:

答案 0 :(得分:3)

我没有找到一种方法来使用具有相同名称的控制器和模型问题而没有任何名称空间 因此,我的最终解决方案是使用LikeableModelLikeableController关注点。

答案 1 :(得分: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

答案 2 :(得分:0)

我遇到了同样的问题,但是我可以通过命名控制器和模型问题来解决此问题。我将所有模型关注点移至app/models/concerns/models/,所有控制器关注点移至app/controllers/concerns/models/。这样,就可以使模型和控制器问题具有相同的名称。

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

答案 3 :(得分:0)

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

在这种情况下,我要做的是在app/controllers/concerns/likeable/respondable.rb中创建一个文件,该文件实现了Controller提供的Likeable::Respondable功能。 (可以根据需要找到比Respondable更好的名称-例如,如果控制器只真正处理了有关参数的逻辑,则可以将其命名为Likeable::Paramable,依此类推。)

类似地,如果Likeable支架的模型端主要与持久性逻辑有关,则可以在Likeable::Persistable中定义一个app/models/concerns/likeable/persistable.rb模块。

通过这种方式,您仍然可以将所有逻辑用于喜欢的对象,并在单个名称空间中保留,并针对您的控制器和模型问题获得更具体的说明。

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