2013-10-15 74 views
1

进出口使用引导&轨道和有一个用户模式和后model..users创造职位(集合)..Rails的全局变量

与我希望用户能够点击下拉导航栏引导其显示他们的职位名称..我在一个控制器上做了这个私人方法和before_action,但我不想这样做的所有控制器,它不适用于应用程序控制器...

有没有更好的方法来做到这一点?

我这样做

def list 
    @user = User.find_by_username(params[:id]) 
    @collections = @user.collections 
end 

before_action :list 

在控制器

什么是实现这一目标的最语义的方式顶端?

+0

“它不适用于应用程序控制器”,这是什么意思?有什么错误?什么?如果动作/过滤器是需要为任何动作运行的“全局”东西,它应该作为ApplicationController中的before_action/filter – arieljuod

回答

0

我得到了它与这个应用程序控制器

before_action :list 

private 

    def list 
    @collections = current_user.collections 
    end 

感谢@arieljuod

2

如果你能都转移到你的应用程序控制器,那么这将是提供给任何控制器工作。更一般地说,我不确定这是否是解决问题的最佳方法。

这些提示也可能有用。

  1. 你在使用设计吗?或者其他一些身份验证插件?如果是这样,你可能会有一个current_user帮手。这可以让你简单地做@collections = current_user.collections
  2. 尽可能,我建议使用更多的描述性名称作为您的操作和参数。 def fetch_list_collections可能是一个更好的名称,或者不是传递一个名为id的参数,或许您的参数应该命名为username。这些命名约定对于其他可能查看代码的人以及如果您返回并尝试记住您在N个月前写入的内容时都非常重要。
  3. 您的列表操作正在生成N + 1个查询。这意味着您只需要一次就可以多次访问数据库。请参阅此处的导轨指南。你也可以看看如何避免这个w/devise。设计是非常有据可查的,我敢打赌,维基在讨论这个问题。
  4. 您可能需要考虑限制何时调用此操作 - 至少需要 - 更新操作的发布请求?他们登录前怎么样? current_user可能是nil,并且在nil上尝试调用collections方法时出错。

花时间学习这些东西。您不必一次全部学习,但我认为上述可能会有所帮助。