代码之家  ›  专栏  ›  技术社区  ›  EastsideDev

应用程序助手方法是否可用于所有视图?

  •  6
  • EastsideDev  · 技术社区  · 12 年前
    Rails 4.1
    Ruby 2.0
    Windows 8.1
    

    在helpers/application_helper.rb中,我有:

    def agents_and_ids_generator
        agents = Agent.all.order(:last)
        if agents
          agents_and_ids = [['','']]
          agents.each do |l|
            name = "#{l.first} #{l.last}"
            agents_and_ids << [name,l.id]
          end
          return agents_and_ids
        end
      end
    

    在我的views/agents/form.html.erb中,我有以下内容:

    <%= f.select :agent_id, options_for_select(agents_and_ids_generator) %>
    

    在controller/agents_controller.rb中,我有以下内容:

    include ApplicationHelper
    

    但当我转到该视图时,我会收到以下错误消息:

    #<#的未定义局部变量或方法“agents_and_ids_generator”:0x00000006fc9148>

    如果我将agents_and_ids_generator方法移动到helpers/agents_helper.rb,它会正常工作。

    我认为通过将方法放在应用程序助手中并将应用程序包含在控制器中,这些方法就可以用于视图。我的假设不正确吗?

    答覆:

    确保控制器中不包含应用程序助手,并添加了以下简化:

    <%= f.collection_select :agent_id, Agent.all.order(:last), :id, :name_with_initial, prompt: true %>
    
    #app/models/agent.rb
    Class Agent < ActiveRecord::Base
       def name_with_initial
         "#{self.first} #{self.last}"
       end
    end
    
    2 回复  |  直到 12 年前
        1
  •  7
  •   Richard Peck    12 年前

    帮助者

    底线答案是 application_helper 在所有视图中都可用。

    Rails实际上在所有地方都使用助手,从 form_for 其他内置Rails方法。

    因为Rails基本上只是一系列类&模块 helpers 在渲染视图时加载,允许您在需要时调用它们。 Controllers 在堆栈中处理的时间要早得多,因此必须在其中显式包含所需的助手

    重要的 -您不需要包括 ApplicationHelper 在您的 ApplicationController 应该 正常工作


    您的问题

    可能有几个潜在的问题;我有两个想法给你:

    1. 是您的 AgentsController 继承自 应用程序控制器 ?
    2. 也许你把 应用程序帮助程序 正在引发问题

    奇怪的是你的 AgentsHelper 工程,以及 应用程序帮助程序 没有。解释这一点的一种方法是Rails将根据正在操作的控制器加载一个助手,这意味着如果您不继承 ApplicationController, 这个 应用程序帮助程序 不会被呼叫。

    您需要使用以下工具进行测试:

    #app/controllers/application_controller.rb
    Class AgentsController < ApplicationController
       ...
    end
    

    接下来,你需要摆脱 include ApplicationHelper 在您的控制器中。这只会使助手可用于该类(控制器),而不会对视图产生任何影响

    话虽如此 也许 导致视图加载时出现问题 应用程序帮助程序 -这意味着你应该测试从你的 应用程序控制器


    方法

    最后,可以使用 collection_select :

    <%= f.collection_select :agent_id, Agent.all.order(:last), :id, :name_with_initial, prompt: true %>
    
    #app/models/agent.rb
    Class Agent < ActiveRecord::Base
       def name_with_initial
           "#{l.first} #{l.last}"
       end
    end
    
        2
  •  2
  •   marknuzz    4 年前

    Rails 5更新。我遇到了一个类似的问题,即视图没有从application_helper.rb中获取方法。 This post 帮助了我。新rails应用程序的helpers目录中提供的文件仅用于这些视图。application_helper.rb中的方法不会自动对所有视图可用。要创建可用于所有视图的助手方法,请在助手目录中创建一个新的助手文件,例如 clean_emails_helper.rb 并在此处添加自定义方法,如下所示:

    Module CleanEmailsHelper
      def clean_email(email)
         *do some stuff to email*
         return email
      end
    end
    

    然后你可以打电话 <%= clean_email(email) %> 从应用程序中的任何视图。