1

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

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

有一个更好的方法吗??

我在做这个

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

和一个

before_action :list 

在控制器的顶部

实现此目的最语义化的方式是什么?

4

2 回答 2

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.

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

于 2013-10-15T03:35:52.927 回答
0

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

before_action :list

private

  def list
    @collections = current_user.collections
  end

谢谢@arieljuod

于 2013-10-15T03:28:51.763 回答