【问题标题】:Rails global variableRails 全局变量
【发布时间】:2013-10-15 03:07:03
【问题描述】:

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

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

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

我正在这样做

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

还有一个

before_action :list 

在控制器的顶部

最符合语义的方法是什么??

【问题讨论】:

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

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


【解决方案1】:

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

这些提示也可能有用。

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

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

【讨论】:

    【解决方案2】:

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

    before_action :list
    
    private
    
      def list
        @collections = current_user.collections
      end
    

    感谢@arieljuod

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      相关资源
      最近更新 更多