我有一个属于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
中的辅助方法虽然这有效但它会使控制器变胖。如何将其移至模型中?
答案 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