【问题标题】:Getting an undefined method even though I have defined it in my controller即使我在我的控制器中定义了一个未定义的方法
【发布时间】:2016-05-12 12:26:08
【问题描述】:

我使用的是 Rails 4.2.3。我想在我的管理员登录页面上有一个选项卡式菜单,所以我将以下内容添加到我的 app/controllers/admin_controller.rb 文件中……

class AdminController < ApplicationController
  before_filter :must_be_admin, only: :index

  def index
    @page_id = "index"
  end

  def menu_builder(page_id)
    tabs = ['Current Hacks','Add New Hack','Approve Hacks']
    content = ""
    tabs.each do |tab|
      content << if page_id == tab
        content_tag('li', content_tag('a', tab, :href => nil ), :class => 'current') + " "
      else
        content_tag('li', content_tag('a', tab, :href => "/#{tab}" )) + " "
      end
    end
    content
  end

这是我的 app/views/admin/index.html.erb 文件中的内容……

<h1>Admin#index</h1>
<ul>
    <%= menu_builder(@page_id) %>
</ul>

但是,当我访问我的 /admin/index 页面时,我收到了这个错误

undefined method `menu_builder' for #<#<Class:0x007f861bfe9900>:0x007f861bff36f8>

我哪里错了?

【问题讨论】:

  • 控制器中定义的方法实际上是动作,因此您无法在控制器中定义传递参数的方法。你需要menu_builder(page_id)的助手

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


【解决方案1】:

要在您的视图中使用 rails 方法,您必须在 helpers 中定义它,并且不在控制器中。

例如

admin_helper.rb

   def menu_builder(page_id)
     ###definition
   end

所以现在,可以在来自admins_controller.rbadmins/ 内的任何视图中调用此方法 但是如果你想让它对所有视图都可用,那么你必须将它添加到application_helper.rb

【讨论】:

    【解决方案2】:

    您不能在视图中直接使用控制器操作(它们是通过 HTTP 请求从路由中调用的)。

    您需要在 AdminHelper 模块中定义 menu_builder 方法,然后在您的 AdminController 中调用 helper AdminHelper

    更多信息请参见http://api.rubyonrails.org/classes/ActionController/Helpers.html

    【讨论】:

      【解决方案3】:

      嘿,它正在它的 helper 中寻找这个方法。在助手中定义该方法,然后将其称为视图。您不能从视图中调用控制器方法..

      【讨论】:

      • 您可以使用:helper_method 将其定义为可供视图使用
      【解决方案4】:

      请将menu_builder 方法添加到AdminHelper(app/helpers/admin_helper.rb)。否则,将 menu_builder 方法添加到其他一些帮助程序,并将该帮助程序包含在您的 AdminController 中。 AdminHelper 中最好有menu_builder 方法。

      控制器中的方法通常用于“动作”,通常必须通过路由定义和使用。

      【讨论】:

        【解决方案5】:

        只需将方法从控制器移动到任何帮助程序(可能是 applicaiton_helper),然后您就可以创建所需的视图

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多