我有两个分享行为的模型。 [HttpPost]
public ActionResult ActionForAjaxForm(FormModel model)
{
// do something like save the posted model
return PartialView("_YourPartialView", model);
}
和Post
都可以有反应。
Comment
当我装饰它们时,我最终得到了许多完全相同的方法。
# ./app/models/post.rb
class Post < ApplicationRecord
has_many :reactions, as: :reactionable
end
# ./app/models/comment.rb
class Comment < ApplicationRecord
has_many :reactions, as: :reactionable
end
我希望它看起来像这样,但不知道放置文件的位置,以及我应该使用哪种技术(# ./app/decorators/post_decorator.rb
class PostDecorator < ApplicationDecorator
delegate_all
def reactions_total_count
object.reactions.count
end
def reactions_type(kind)
object.reactions.collect(&:reaction_type).inject(0) {|counter, item| counter += item == kind ? 1 : 0}
end
def likes_count
reactions_type('like')
end
def hearts_count
reactions_type('heart')
end
def wows_count
reactions_type('wow')
end
def laughs_count
reactions_type('laugh')
end
def sads_count
reactions_type('sad')
end
end
# ./app/decorators/comment.rb
class CommentDecorator < ApplicationDecorator
delegate_all
def reactions_total_count
object.reactions.count
end
def reactions_type(kind)
object.reactions.collect(&:reaction_type).inject(0) {|counter, item| counter += item == kind ? 1 : 0}
end
def likes_count
reactions_type('like')
end
def hearts_count
reactions_type('heart')
end
def wows_count
reactions_type('wow')
end
def laughs_count
reactions_type('laugh')
end
def sads_count
reactions_type('sad')
end
end
与include
)。
extend
请指教。我知道有一种更好的方法,我似乎无法做对。
答案 0 :(得分:1)
首先,我会为包含的模块找出更好的名称。它可以被视为角色,您可以使用它来丰富类。此角色将声明一组*_count
方法,这些方法在reactions
中计算smth。
所以我将它命名为ReactionsCountable
并另外将其放入命名空间以区别于装饰器:Roles::ReactionsCountable
。
然后我会把它放进去:
/app/decorators
/roles
/reactions_countable.rb
/comment.rb
/post.rb
其他的方法是使用经典的遗产。这里的Base
名称有意义IMO:
class BaseDecorator < ApplicationDecorator
# declare `*_count` methods here
class PostDecorator < BaseDecorator
class CommentDecorator < BaseDecorator
答案 1 :(得分:0)
我在Maicher的回答中找到了答案。
如果CommentDecorator
位于./app/decorators/comment_decorator.rb
内,并且我们想要包含一个模块ReactionablesCountable
,那么我们需要在./app/decorators/roles/reactions_countable.rb
内创建一个具有模块的文件嵌套,它反映了文件的路径。例如,include
中的第一个常量,(Roles
)指向文件夹Rails将查找它,第二个(ReactionsCountable
)是文件的名称。
模块也需要嵌套在此文件中。我已经在下面展示了它。
module Roles
module ReactionsCountable
# methods defined here.
end
end