Im使用bootstrap和rails,并具有用户模型和post模型。用户创建帖子(集合)。
使用导航栏中的引导程序,我希望用户能够单击显示其帖子名称的下拉列表。我在一个控制器上用私有方法和before_action做了这个,但我不想对所有控制器都这样做,它对应用程序控制器不起作用......
有没有更好的方法??
我正在这样做
def list
@user = User.find_by_username(params[:id])
@collections = @user.collections
end
和
before_action :list
在控制器顶部
实现此目的的最语义方法是什么?
如果您可以将两者移动到应用程序控制器,那么它将可用于任何控制器。更一般地说,我不确定这是否是解决问题的最佳方法。
这些提示也可能有用。
- 你在使用设计吗?还是其他身份验证插件?如果是这样,您可能会有一个
current_user
助手。 这将允许您简单地执行@collections = current_user.collections
- 在可能的情况下,我建议为您的操作和参数使用更具描述性的名称。
def fetch_list_collections
可能是一个更好的名称,或者而不是传递一个名为id
的参数,也许您的参数应该命名为username
。 这些命名约定对于可能查看您的代码的其他人以及如果您返回代码并试图记住 N 个月前编写的内容的您自己都变得非常重要。 - 列表操作正在生成 N+1 个查询。 这意味着您多次访问数据库,而您应该只访问一次。 请参阅有关此内容的导轨指南。 您也可以寻找避免这种情况的方法。 Devise有很好的文档记录,我敢打赌维基中有一些东西在讨论这个问题。
- 您可能需要考虑在调用此操作时限制 - 至少 - 对更新操作的发布请求? 在他们登录之前呢?current_user可能
nil
,并且尝试在nil
上调用collections
方法时出错。
花点时间学习这些东西。 您不必一次学习所有内容,但我认为上述内容可能会有所帮助。
我让它在应用程序控制器中使用它
before_action :list
private
def list
@collections = current_user.collections
end
谢谢@arieljuod