Rails 4:在哪里放置所有控制器所需的功能

时间:2015-04-18 06:51:33

标签: ruby-on-rails-4 methods controller

我正在尝试确保以下方法

           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是零,所以打电话"采取"在零上投掷错误。 菜鸟错了。

2 个答案:

答案 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