2

管理タスクを管理するための管理コントローラーとビューがあります。これらのタスクの多くは、モデルに基づく 2 つの主要なコントローラーであるユーザーとマテリアルで実行されるタスクと非常によく似ています。コードを枯らそうとしているので、どこかに置きたいのですが、どこに?

例えば:

管理者として、自分の管理ビューからマテリアルを削除できますが、ユーザーもマテリアル ビューから削除できます。リダイレクトが別の場所に移動するという唯一の例外を除いて、管理コントローラーとマテリアル コントローラーの両方でこのためのほぼ同じコードがあります。

4

2 に答える 2

2

Rails4 のやり方は、Concernsを使用することですが、それについてはいくつかの議論が行われています。それでも、私はこのアプローチが気に入っていますが、見つけた資料のほとんどはコントローラーよりもモデルに関するものです。

簡単な例

Rails 3 を使用している場合 (タグが示すように)、concerns-folder をcontrollers-folder に追加し、それを autoload-path に追加します。

#config/application.rb
config.autoload_paths += %W(#{config.root}/app/controllers/concerns)

たとえば、私はこのようなものを持っていますapp/controllers/concerns/can_can_sanitizer.rb

module CanCanSanitizer
  extend ActiveSupport::Concern

  included do
    before_filter do
      resource = controller_path.singularize.gsub('/', '_').to_sym
      method = "#{resource}_params" 
      params[resource] &&= send(method) if respond_to?(method, true)
    end
  end
end

他のモジュールと同じように、これを application_controller に含めます。

include CanCanSanitizer

確かに、最適なユースケースではありませんが、有利なスタートが切れるはずです。

于 2013-09-22T18:04:40.240 に答える
1

AdminsController が UsersController から継承されている場合は、メソッドの引数またはコントローラー名またはコードの前にあるコードとの違いを判断して、そのようなメソッドを UsersController に入れることができますsuper

Admin と User に継承がない場合は、別のモジュールを作成して、Admin と User の両方に含めることができます。

于 2013-09-22T18:04:31.437 に答える