0

UserとFirmに属するLogモデルがあります。これを設定するために、logs_controllerのcreateアクションにこのコードがあります。

 def create
     @log = Log.new(params[:log])
     @log.user = current_user
     @log.firm = current_firm
     @log.save
   end

current_userとcurrent_firmは、application_helper.rbのヘルパーメソッドです。

これが機能している間、コントローラーは太くなります。これをモデルに移動するにはどうすればよいですか?

4

3 に答える 3

3

この種の機能は、の「worker」クラスに属していると思いますlib/。私のアクションメソッドは次のようになります

def create
  @log = LogWorker.create(params[:log], current_user, current_firm)
end

そして、私は次のlib/log_worker.rbようなモジュールを持っているでしょう

module LogWorker
  extend self

  def create(params, user, firm)
    log      = Log.new(params)
    log.user = user
    log.firm = firm

    log.save
  end
end

これは単純化された例です。私は通常、すべてに名前空間を付けるので、私のメソッドは実際にはMyApp::Log::Manager.create(...)

于 2012-12-18T00:32:42.847 に答える
0

違いはありません:コードをリファクタリングできます:

def create
  @log = Log.new(params[:log].merge(:user => current_user, :firm => current_firm)
  @log.save
end

そして、あなたのログは以下をしなければなりません:

attr_accessible :user, :firm
于 2012-12-18T00:32:34.123 に答える
0

それほど短くはありませんが、current_userの処理の責任はMVCのコントローラーにあります

def create
 @log = Log.create(params[:log].merge(
   :user => current_user,
   :firm => current_firm))
end

編集

MVCに少し違反してもかまわない場合は、次の方法でそれを行うことができます。

# application_controller.rb
before_filter :set_current
def set_current
  User.current = current_user
  Firm.current = current_firm
end

# app/models/user.rb
cattr_accessor :current

# app/models/firm.rb
cattr_accessor :current

# app/models/log.rb
before_save :set_current
def set_current
  self.firm = Firm.current
  self.user = User.current
end

# app/controllers/log_controller.rb
def create
  @log = Log.create(params[:log])
end
于 2012-12-18T00:39:16.150 に答える