帮助方法无法识别 - 可能是因为命名空间?

时间:2013-12-17 15:59:54

标签: ruby-on-rails namespaces ruby-on-rails-4

所以我有一个Admin命名空间和一个sessions控制器。

当我生成控制器时还有一个admin/sessions_helper.rb,所以我一直在设置一些方法,但是我似乎无法调用它们。这是命名空间吗?

错误

undefined local variable or method `sign_out' for #<Admin::SessionsController:0x007fe2b2f55680>

  def destroy
    sign_out
    redirect_to admin_path
  end
end

sessions_controller.rb

class Admin::SessionsController < AdminController

  ...

  def destroy
    sign_out
    redirect_to admin_path
  end
end

系统管理员/ sessions_helper.rb

module Admin::SessionsHelper
  ...

  def sign_out
    self.current_user = nil
    cookies.delete(:remember_token)
  end
end

请注意,我没有在任何地方包含帮助程序,因为在文档中它表示all helpers are included by default

2 个答案:

答案 0 :(得分:3)

控制器中没有助手。帮助程序旨在混合到视图上下文中。

有一些解决方法可以让帮助程序对视图和控制器都可用,但实际上它应该是有意义的。您定义的sign_out方法在视图中根本没有意义。

我建议你在AdminController中定义它(它看起来是所有管理控制器继承自的基本控制器)。

module AdminController
  ...

  private

  def sign_out
    self.current_user = nil
    cookies.delete(:remember_token)
  end
end

请务必将其标记为私有,否则Rails可能会将其用作控制器操作。

答案 1 :(得分:1)

在不包含模块的情况下从控制器调用辅助方法的好方法是使用view_context

class Admin::SessionsController < AdminController
  def destroy
    view_context.sign_out
    redirect_to admin_path
  end
end

但我同意@ simone-carletti,这不是一种帮助方法。