【问题标题】:Helper method not being recognised - possibly because namespaced?辅助方法未被识别 - 可能是因为命名空间?
【发布时间】:2014-01-05 11:49:49
【问题描述】:

所以我有一个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

admin/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

【问题讨论】:

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


    【解决方案1】:

    助手在控制器中不可用。帮助器被设计为混合到视图上下文中。

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

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

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

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

    【讨论】:

    • 好的,谢谢。你知道为什么 Michael Hartl 在他的 tutorial 中做的不同吗?
    • 在教程中他定义了SessionsHelper,然后他在控制器中混合了助手。这样,助手内部的方法将可用于视图和控制器。正如我所说,有时它是有道理的,但在你的情况下却没有,因为从视图中调用 sign_out 并没有多大意义。
    【解决方案2】:

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

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

    但我同意@simone-carletti,这感觉不像是辅助方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 2021-02-11
      • 2014-01-21
      相关资源
      最近更新 更多