2

私のアプリケーションには、ユーザー モデル/コントローラーがあります。ユーザーは、複数のビデオ、画像、ブログ アイテムを持つことができます。ユーザー、アイテムにはコメントを付けることができます。だから私は次のコントローラを持っています

  • ユーザー
  • ユーザー/コメント
  • ユーザー/画像
  • ユーザー/写真/コメント
  • ユーザー/ビデオ
  • ユーザー/動画/コメント
  • ユーザー/ブログ
  • ユーザー/ブログ/コメント

問題は、すべてのコメント コントローラーがほとんど同じであり、コードの管理が難しくなっていることです。ここで、サブコントローラーから呼び出されるメソッドを持つ、アプリレベルの 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 && @picture の初期化は、異なるメソッド間で同じです (destroy、delete_all、create、index)。サブコントローラー固有の before_filter に移動できますか? そして、delete_all は CommentsController に実装されますか?

4

1 に答える 1

4

コードが一般的な場合、次の 2 つのオプションがあります。

1) 共有メソッドを含むモジュール

例:

module CommentsActions
  # actions, methods
end

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

2) 1 つのコントローラーからコメントコントローラーをサブクラス化する

例:

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

class User::Picture::CommentsController < CommentsController
  #your additional actions
end
于 2012-08-17T09:26:30.177 に答える