如何抽象许多控制器之间共享的通用代码

时间:2012-08-17 09:19:33

标签: ruby-on-rails

在我的应用程序中,我有一个用户模型/控制器。用户可以拥有多个视频,图像和博客项目。用户和项目可以有评论。所以我有以下控制器

  • 用户
  • 用户/评论
  • 用户/图片
  • user / picture / comments
  • 用户/视频
  • 用户/视频/评论
  • 用户/博客
  • 用户/博客/评论

问题是,所有注释控制器几乎完全相同,代码变得难以管理。现在我想指定一个中心位置,例如一个app级的CommentsController,它可以从子控制器中调用方法。

最好的方法是什么?

例如,以下代码将如何处理此类更改:

class User::Picture::CommentsController < ApplicationController
  def delete_all
    @user = User.find(params[:user_id])
    @picture = @user.pictures.find(params[:picture_id])

    if @picture.has_access(current_user)
      @picture.comments.destroy_all

      redirect_to :back, :notice=>t(:actionsuccesful)
    else
      redirect_to :back, :alert=>t(:accessdenied)
    end
  end
end

@user&amp;&amp; @picture初始化在不同方法中是相同的(destroy,delete_all,create,index)。它们是否可以移入before_filter,这将是一个特定的子控制器?然后,delete_all将在CommentsController中实现?

1 个答案:

答案 0 :(得分:4)

如果代码是通用的,有两个选项:

1)包含共享方法的模块

示例:

module CommentsActions
  # actions, methods
end

class User::Picture::CommentsController <ApplicationController
  include CommentsActions
  #your additional actions
end

2)从一个控制器继承注释控制器

示例:

class CommentsController < ApplicationController
  # actions, methods, filters etc...
end

class User::Picture::CommentsController < CommentsController
  #your additional actions
end