0

私は中規模のRailsアプリケーションで作業しており、すべてのコントローラーでこれを実行します。

def create
  @object = Model.new(params[:model].merge(editing_user: current_user))
  ...
end

def update
  @object = Model.find(params[:id])
  @object.editing_user = current_user
  ...
end

編集ユーザーを何度も設定することはDRYではありません。オブザーバーでこれをクリーンアップすることを考えましたが、現在のユーザーにアクセスする必要があります。オブザーバーは現在のユーザーにアクセスできません。また、オブザーバーもアクセスできません(デメテルの法則)。

コントローラ間でこれを乾かす方法について何か提案はありますか?

4

3 に答える 3

1
class ApplicationController < ActionController::Base
  before_filter :init_request

  def init_request
    params[:editing_user] = current_user
  end
end
于 2012-08-02T17:05:42.717 に答える
1

decent_exposureを使用してコントローラーを乾かすのが好きです。:idがparamとして渡されたかどうかに基づいて、モデルインスタンスを自動的に検索または初期化し、から属性を割り当てますparams[:model]

コードの枯渇を完了するには、新しい戦略サポート(readmeの最後を参照)を使用editing_userして、モデルに属性を自動的に設定できます。

于 2012-08-02T17:07:55.687 に答える
1

あなたはこれのために試すことができafter_filterます。おそらくそのようなもの:

class ApplicationController < ActionController::Base
  after_filter :set_editing_user

def set_editing_user
  @object.update_attribute(:editing_user, current_user) if @object && current_user
end

もちろん、難しいのは、呼び出しごとに2回オブジェクトを保存することです。一般に、作成と更新はそれほど頻繁には行われないため、2つのデータベースのコミットは深刻な問題ですが、次のTwitterになると予想される場合は、データベースの挿入負荷が大きいため、問題になる可能性があります。

これをで設定することもできますがbefore_filter、その場合は前のでオブジェクトを検索または設定する必要がありますbefore_filter。それ以外の場合@objectは常にnilになり、before_filter発火することはありません。フィルタの順序付け方法prepend_before_filterを使用してappend_before_filter、これらのフィルタの正しい順序を確認できます。

于 2012-08-02T17:10:19.293 に答える