【问题标题】:Rails 3. How to add a helper that ActiveAdmin will use?Rails 3. 如何添加 ActiveAdmin 将使用的助手?
【发布时间】:2012-01-30 04:21:19
【问题描述】:

我正在创建一个供 Formtastic 使用的助手,但我收到了 undefined local variable or method 错误。我不知道把它放在哪里才能工作。

我已经在 application_helper.rb 和 app/helpers/active_admin/view_helpers.rb 中尝试过

【问题讨论】:

  • 对我来说,ApplicationHelper 似乎是自动加载的,但我需要重新启动我的应用程序才能让 ActiveAdmin 检测到任何新的助手

标签: ruby-on-rails ruby helpers activeadmin


【解决方案1】:

您可以尝试在 app/helpers/ 中定义它们,但您需要通过活动管理员的初始化程序将它们包括在内,如下所示:

# in config/initializers/active_admin.rb
ActiveAdmin.setup do |config|
    ....
end

module ActiveAdmin::ViewHelpers
  include ApplicationHelper
end

【讨论】:

  • 这个解决方案乍一看似乎有效,但最终在管理员登录页面上产生了冲突。我相信这种冲突是因为来自面向用户的应用程序的设计助手。 @alony 解决方案对我有用,但如果您从面向用户的应用程序中重用帮助程序,当然不会那么枯燥。如果您在此方法中包含 ApplicationHelper 以外的帮助程序,也许不会发生冲突?
  • 这对我来说仍然适用于 Rails 4.2。我找不到任何冲突,我正在使用 Devise。但我没有管理员登录页面 - 我有一个用于消费者和管理员的用户模型。
  • 使用 rails 5.1.6, active_admin 1.3.0 为我工作
【解决方案2】:

你需要把你的辅助函数放在app/helpers/active_admin/views_helper.rb 文件中 示例:

module ActiveAdmin::ViewsHelper #camelized file name
  def my_helper 
       # do something 
  end 
end 

【讨论】:

  • 另一个提示:在 0.5.0 中,您应该重新启动整个堆栈以使其工作。
  • 谢谢德米特里。我正要放弃,然后我意识到我必须重新开始:)
  • @DmitryPolushkin,1.0.0.pre。我最终按照 bishma-stornelli 的建议做了。至少它不依赖于 AA 开发人员无法抗拒定期更改的空灵约定。
  • 如果您想在收集操作中也使用此辅助方法,请执行以下操作:controller do include ActiveAdmin::ViewsHelper endcollection_action :my_action do render json: my_helper end
  • 在 ActiveAdmin 1.0.0.pre4 中,“模块 ActiveAdmin::ViewHelpers”不起作用,但正如本答案中所解释的,“模块 ActiveAdmin::ViewsHelper”确实起作用。此外,我确实必须重新启动整个堆栈。谢谢@alony!
【解决方案3】:

我在使用 ActiveAdmin 0.6.1 时发现 ActiveAdmin 会在 app/helpers/active_admin/*_helper.rb 中寻找帮助程序,但名称并不重要

重要的是:

  1. 文件名必须以“_helper.rb”结尾
  2. 模块名必须是文件名的驼峰式
  3. 该文件必须位于 app/helpers/active_admin/ 目录中。

如果有人知道官方记录在哪里,那就太棒了。

这里是一个例子:https://gist.github.com/afred/7035a657e8ec5ec08d3b

【讨论】:

    【解决方案4】:
    app/helpers/active_admin/view_helpers.rb
    

    没有帮助我

    已编辑:我将其更改为 views_helper.rb 和 ViewsHelper 并相应地工作

    *但是如果你只想为某些资源定义它,你可以按照我的方式来做


    我必须定义

    #app/helpers/active_admin/categories_helper.rb
    
    module ActiveAdmin::CategoriesHelper
    
      def helper_method
    
      end
    
    end
    

    对于我的 active_admin 资源 app/admin/categories.rb

    【讨论】:

      【解决方案5】:

      另一种方法是让幕后生成的特定 ActiveAdmin 控制器包含帮助程序。此方法将允许在每个文件中显式包含帮助器,而不是全局。

      ActiveAdmin.register MyModel do
        controller do
          include MyHelper
        end
      end
      

      【讨论】:

      • 如果您想在活动管理员和应用程序的其余部分中使用一些逻辑,这非常有用。
      【解决方案6】:

      我可以让它在 ActiveAdmin 0.6.1 中工作(终于!)。解决方案是创建一个辅助模块,如下所示:

      # app/helpers/active_admin_helpers.rb
      module ActiveAdminHelpers
        # make this method public (compulsory)
        def self.included(dsl)
          # nothing ...
        end
      
        # define helper methods here ...
        def helper_method
          ...
        end
      end
      

      然后以这种方式包含此模块:

      # app/admin/[resource].rb
      include ActiveAdminHelpers
      
      ActiveAdmin.register [Resource] do
        ...
      
      end
      

      实际上,这不是一个很好的解决方案,但它很干且工作良好。我已经阅读并尝试了很多方法和解决方案,例如 ViewHelpers 模块(放在 'app/helpers' 或 'app/admin/active_admin' 下)、ActiveAdmin::DSL 猴子补丁……但那些从未在版本中工作过0.6.1(我对其他版本没有任何想法):(

      【讨论】:

      • 这个解决方案在技术上是可行的,但这不是一个好主意。实际上,您在顶层的 Object 中包含了 ActiveAdminHelpers。这意味着一旦加载此文件,这些辅助方法就可用于整个应用程序中的每个对象
      • 事实上这是一个糟糕的主意。在全球范围内包含助手将以意想不到和无法追踪的方式造成严重破坏......我现在正在忍受它...... :(
      • 我刚刚解决并修复了我们的应用程序中的一个问题,即开发人员完成了这样的全局包含。绝对不是一个好方法。
      【解决方案7】:

      app/admin/active_admin/view_helpers.rb 中定义ActiveAdmin::ViewHelpersactiveadmin 0.3.40.5.0 有效。

      【讨论】:

        【解决方案8】:

        使用来自 git://github.com/activeadmin/activeadmin.git 的 activeadmin 1.0.0.pre1

        Rails 4.2.1

        这对我有用...

        my_app/app/helpers/active_admin/resources_helper.rb

        module ActiveAdmin
          module ResourcesHelper
            def resource_form_for(_resource, _params, _options = {}, &_block)
              url = if _resource.new_record?
                      UrlBuilder.resources_path(_resource.class, _params)
                    else
                      UrlBuilder.resource_path(_resource.class, _params)
                    end
        
              method = _resource.new_record? ? :post : :put
        
              options = { url: url, method: method, builder: ActiveAdmin::FormBuilder }
              options.merge!(_options)
        
              semantic_form_for([:admin, _resource], options) do |f|
                _block.call(f)
              end
            end
          end
        end
        

        my_app/app/admin/balance_sheets.rb

        ActiveAdmin.register BalanceSheet do
          form partial: 'form'
        end
        

        my_app/app/views/admin/balance_sheets/_form.html.erb

        <%= resource_form_for(resource, params) do |f| %>
          <%= f.inputs "Fields" do %>
            <%= f.input :progress_status %>
            <%= f.input :crew %>
            <%= f.input :shift %>
            <%= f.input :expected_progress %>
            <%= f.input :real_progress %>
            <%= f.input :analyst, collection: User.analysts %>
            <%= f.input :activity_ids, as: :check_boxes, collection: Activity.balance_sheet_activities %>
            <%= f.input :worker_ids, as: :check_boxes, collection: Worker.all %>
          <% end %>
          <%= f.actions %>
        <% end %>
        

        【讨论】:

          【解决方案9】:

          您也可以使用 ActiveAdmin 部分:

          render partial: 'admin/my_partial', locals: { var: my_var }

          app/views/admin/_my_partial.html.arb 你的 active_admin ruby​​ 代码中。

          【讨论】:

            【解决方案10】:

            使用 Rails 3.2.11 和 gem activeadmin (0.5.1) 对我有用的不是添加 app/active_admin/view_helpers.rb 文件,或在 config/initializers/active_admin.rb 中声明任何模块

            我将我的助手按模型逻辑地放入 app/*_helpers.rb 文件中。然后在我使用的 app/admin/model.rb 文件中:

            # app/admin/[resource].rb
            ActiveAdmin.register [Resource] do
              ...
              filter :gender, as: :select, collection: proc{genders}
              ...
            end
            

            要在过滤器中使用帮助器,在列表视图中显示要过滤的性别下拉列表。对于相应的创建表单字段,我使用了:

            # app/admin/[resource].rb
            ActiveAdmin.register [Resource] do
              form do |f|
                f.inputs "Case Manager" do
                  ...
                  f.input :gender, as: :radio, collection: genders
                  ...
                  f.buttons
                end
              end
            end
            

            显示输入表单的单选按钮。

            不知道为什么 proc{} 需要在 form do |f| 块之外,但如果有人能解释为什么这是一个坏主意,我会找到不同的方法。

            【讨论】:

            • 因为 proc 正在使里面的代码稍后进行评估。我认为 aa 在启动时加载了 admin/* 类,有时存在未满足的依赖关系。因此,使用 proc,您是在告诉代码在加载所有内容时执行。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-12-20
            • 1970-01-01
            • 1970-01-01
            • 2017-11-01
            • 2013-05-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多