我正在尝试确保以下方法
def current_user
current_user = current_member
end
可用于所有控制器中的所有操作 我试过把它放在ApplicationsController中没有运气。
我尝试使用以下
中的解决方案Where to put Ruby helper methods for Rails controllers?
没有效果。
Rails-way解决方案是什么?
我的ApplicationsHelper中有相同的方法,我可以在我的视图中访问它没问题。
编辑:
提供更多细节。 我有一个带有我从头开始构建的身份验证系统的应用程序,它在一个名为" current_user"
的SessionHelper文件中使用了一个函数。我一直在将Devise实现到我的应用程序中,并维护我的用户模型以保存用户详细信息,但创建了一个成员模型来保存设计认证信息(即保持用户配置文件信息与表设计分开使用建议由医生)。
这给了我一个名为current_member的设计辅助方法(基于我对模型的命名)。
我有" current_user"我的应用程序遍布控制器操作和视图中。
我想创建一个app-wide帮助器,将current_member别名为current_user。严格来说,在我的问题中,我的函数是错误的 - 这会将current_user分配给成员类的实例。由于成员和用户之间存在一对一的关系,外键是member.id正确的功能是......
def current_user if member_signed_in? current_user = User.find_by_member_id(current_member.id) 结束 端
我的ApplicationHelper:
module ApplicationHelper
def current_user
if member_signed_in?
current_user = User.find_by_member_id(current_member.id)
end
end
end
这会照顾所有视图中的current_user, 但我无法让它在控制器中工作......例如,在我的" show"中查看此代码。 UserController的动作
def show
@associates = []
@colleagues = current_user.nearbys(1000).take(20)
@colleagues.each do |associate|
unless current_user.following?(associate) || current_user == associate
@associates.push(associate)
end
end
impressionist(@user)
end
忘记逻辑 - 我只是使用地理编码器来查找近乎用户。它的current_user正在解析为" nil"。
即使我把
before_action :current_user
def current_user
if member_signed_in?
current_user = User.find_by_member_id(current_member.id)
end
end
在UserController中,current_user不在该操作中工作。我在其他控制器的操作中也有current_user,应用程序在这些点断开,但当current_user在视图中时不会。
如果您需要更多信息,请与我们联系。
编辑2:
我添加了
before_action :authenticate_member!
对于UsersController,但这仍然没有效果。
编辑3:
我是个白痴。发生了nil类错误,因为我在数据库中没有种子数据,因此 @colleagues = current_user.nearbys(1000).take(20)
@collagues是零,所以打电话"采取"在零上投掷错误。 菜鸟错了。
答案 0 :(得分:0)
定义应用程序操作时,如果希望它们在所有其他操作中可用,则需要设置前置过滤器。因此,在您的应用程序控制器中,您将拥有类似的内容:
before_action :current_user
def current_user
current_user = current_member
end
这将在应用程序中的任何其他操作之前运行此操作,而不管控制器
答案 1 :(得分:0)
我认为你的问题分为两部分。
1 - 在哪里放置所有控制器所需的功能?
所以一般的答案是将它们放在ApplicationController
中,因为通常所有其他控制器都继承自ApplicationController
2 - 关于你得到的错误。
我的猜测是,在调用devise
方法之前,您没有加载devise
。所以尝试像
class ApplicationController < ActionController::Base
before_action :authenticate_member!
before_action :current_user
def current_user
#your method
end
end
并且作为建议,由于您在助手中使用相同的方法,为了保持DRY,您可以使控制器方法成为辅助方法。因此,它将在视图中提供
class ApplicationController < ActionController::Base
helper_method :current_user
before_action :authenticate_member!
before_action :current_user
def current_user
#your method
end
end
所以在您看来,您可以使用current_user
如果所有这些都失败了,因为@ abbott567说你的错误日志发布了。
HTH