0

我有一个属于用户和公司的日志模型。为了进行设置,我在 logs_controller 的创建操作中有此代码。

 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

我相信这种功能属于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 回答