在模型轨中设置嵌套属性

时间:2012-12-18 00:21:46

标签: ruby-on-rails

我有一个属于User and 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

中的辅助方法

虽然这有效但它会使控制器变胖。如何将其移至模型中?

3 个答案:

答案 0 :(得分: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(...)

答案 1 :(得分:0)

没有区别:您可以重构代码:

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

你的日志必须:

attr_accessible :user, :firm

答案 2 :(得分: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