整个 Rails 应用程序中的模型访问

Model Access throughout Entire Rails Application

Ruby 1.9.3 Rails 3.2.8

我有一个视图,它在我的应用程序的每个页面上都呈现在一个局部:

1
2
3
<span id="sync-time">      
  <%= @sync.dropbox_last_sync.strftime('%b %e, %Y at %H:%M') %>
</span>

为了使用我的 syncs 模型并访问 dropbox_last_sync 方法,我必须将它包含在整个应用程序的每个控制器中。例如:

1
2
3
4
5
class EntriesController < ApplicationController
  def index
    @sync = current_user.sync
  end
end

...

1
2
3
4
5
class CurrenciesController < ApplicationController
  def index
    @sync = current_user.sync
  end
end

...等

有没有一种方法可以让 syncs 模型以某种方式包含在我的应用程序控制器中,从而使其在任何地方都可用?


你应该可以在你的应用控制器中添加一个 before_filter:

1
2
3
4
5
6
7
before_filter :setup_sync

def setup_sync
  if current_user
    @sync = current_user.sync
  end
end

您需要注意 setup_sync 过滤器在您用于设置 current_user 的任何代码之后运行。这可能是另一个 before_filter 但只要您在当前用户过滤器之后声明了 before_filter :setup_sync 它将正常工作。


这样更好:

1
2
3
4
5
6
7
8
class ApplicationController < ActionController::Base
  before_filter :authenciate_user!
  before_filter :index

  def index
    @sync = current_user.sync
  end
end

你一直在使用 current_user,所以你需要在这里也有 before_filter :authenciate_user! 并且在另一个之上。