Rails 3. 如何添加 ActiveAdmin 将使用的助手?
Posted
技术标签:
【中文标题】Rails 3. 如何添加 ActiveAdmin 将使用的助手?【英文标题】:Rails 3. How to add a helper that ActiveAdmin will use? 【发布时间】:2012-01-30 04:21:19 【问题描述】:我正在创建一个供 Formtastic 使用的助手,但我收到了 undefined local variable or method
错误。我不知道把它放在哪里才能工作。
我已经在 application_helper.rb 和 app/helpers/active_admin/view_helpers.rb 中尝试过
【问题讨论】:
对我来说,ApplicationHelper
似乎是自动加载的,但我需要重新启动我的应用程序才能让 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 end
collection_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 中寻找帮助程序,但名称并不重要。
重要的是:
-
文件名必须以“_helper.rb”结尾
模块名必须是文件名的驼峰式
该文件必须位于 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::ViewHelpers
对activeadmin 0.3.4
和0.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: procgenders
...
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,您是在告诉代码在加载所有内容时执行。以上是关于Rails 3. 如何添加 ActiveAdmin 将使用的助手?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ActiveAdmin 表单块中使用 rails 6 ActionText 字段
在 Rails 5 应用程序中使用 ActiveAdmin 创建用户个人资料页面
ruby 在Rails 4中的ActiveAdmin中导出CSV导出