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

你可以试试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

当然,困难在于每次调用都要保存对象两次。一般来说,虽然创建和更新不会如此频繁地发生,以至于两次数据库提交是一个严重的问题,但如果您希望成为下一个 Twitter——具有大量数据库插入负载——这可能是一个问题。

您也可以将其设置在 a 中before_filter,但是您必须在 previous 中查找或设置该对象before_filter。否则@object将永远为零并且before_filter永远不会触发。您可以使用过滤器排序方法prepend_before_filterappend_before_filter确保这些过滤器的正确排序。

于 2012-08-02T17:10:19.293 回答
1

我喜欢使用decent_exposure来干掉我的控制器。它会根据 :id 是否作为参数传递来自动查找或初始化模型实例,并从params[:model].

要完成代码干涸,您可以使用新的策略支持(请参阅自述文件的末尾)自动设置editing_user模型的属性。

于 2012-08-02T17:07:55.687 回答