Rails全局变量

时间:2013-10-15 03:07:04

标签: ruby-on-rails ruby variables global-variables

我正在使用bootstrap& rails并拥有一个用户模型并发布模型。用户创建帖子(集合)..

在导航栏中使用bootstrap我希望用户能够单击显示其帖子名称的下拉列表..我在一个控制器上使用私有方法和before_action执行此操作但我不想这样做对于所有控制器,它不适用于应用程序控制器......

有更好的方法吗?

我这样做

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

before_action :list 

位于控制器的顶部

实现这一目标的最具语义的方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您可以将两者都移动到应用程序控制器,那么任何控制器都可以使用它。更一般地说,我不确定这是否是解决问题的最佳方法。

这些提示可能也很有用。

  1. 你在使用装饰吗?还是其他一些身份验证插件?如果是这样,你可能会有一个current_user帮手。这样您就可以简单地执行@collections = current_user.collections
  2. 我建议尽可能为您的操作和参数使用更具描述性的名称。 def fetch_list_collections可能是更好的名称,或者不是传递名为id的参数,也许您的参数应该命名为username。这些命名约定对于那些可能会看到你的代码的人以及你自己回到它并试图记住你在N个月前所写的内容的人来说都变得非常重要。
  3. 您的列表操作正在生成N + 1个查询。这意味着当你应该只执行一次时,你会多次访问数据库。请参阅导轨指南。您可能还会考虑避免这种设计的方法。 Devise有很好的记录,我敢打赌wiki中有一些东西在讨论这个问题。
  4. 您可能需要考虑限制何时调用此操作 - 至少是对更新操作的发布请求?他们登录前怎么样? current_user可能为nil,您尝试在collections上调用nil方法时出错。
  5. 花时间学习这些东西。您不必一次学习所有内容,但我认为上述内容可能会有所帮助。

答案 1 :(得分:0)

我在应用程序控制器中使用它

before_action :list

private

  def list
    @collections = current_user.collections
  end

感谢@arieljuod