ruby-on-rails - form - custom controller activeadmin
Rails 3. ¿Cómo agregar un helper que ActiveAdmin usará? (10)
La definición de ActiveAdmin::ViewHelpers
en app/admin/active_admin/view_helpers.rb
me funciona con activeadmin 0.3.4
y 0.5.0
.
Estoy creando un ayudante para ser utilizado por Formtastic, pero obtengo la undefined local variable or method
error de undefined local variable or method
. No sé dónde ponerlo para que pueda funcionar.
Ya lo intenté en application_helper.rb y en app / helpers / active_admin / view_helpers.rb
Lo que funcionó para mí con Rails 3.2.11 y gem activaadmin (0.5.1) no agregaba el archivo app / active_admin / view_helpers.rb, o declaraba ningún módulo en config / initializers / active_admin.rb
Puse mis ayudantes lógicamente, por modelo, en los archivos app / * _ helpers.rb. Luego, dentro del archivo app / admin / model.rb que utilicé:
# app/admin/[resource].rb
ActiveAdmin.register [Resource] do
...
filter :gender, as: :select, collection: proc{genders}
...
end
Para usar el ayudante en filtros, para mostrar una lista desplegable de géneros para filtrar, en la vista de lista. Para los campos de formulario de creación correspondientes, utilicé:
# 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
Para mostrar botones de radio para el formulario de entrada.
No estoy seguro de por qué se requiere el proc{}
fuera del form do |f|
bloque, pero si alguien puede explicar por qué es una mala idea, voy a encontrar una manera diferente.
Lo que he descubierto al utilizar ActiveAdmin 0.6.1 es que ActiveAdmin buscará ayuda en la aplicación / helpers / active_admin / * _ helper.rb, pero el nombre en realidad no importa .
Lo que importa es:
- el nombre del archivo debe terminar en "_helper.rb"
- el nombre del módulo debe ser el camel-case del nombre del archivo
- el archivo debe estar en la aplicación / helpers / active_admin / directory.
Si alguien sabe dónde está oficialmente documentado esto, sería increíble.
Aquí hay un ejemplo: https://gist.github.com/afred/7035a657e8ec5ec08d3b
Necesita poner sus funciones auxiliares en el archivo app/helpers/active_admin/views_helper.rb
Ejemplo:
module ActiveAdmin::ViewsHelper #camelized file name
def my_helper
# do something
end
end
Otra forma de hacerlo es hacer que el controlador ActiveAdmin específico generado detrás de las escenas incluya al ayudante. Este método permitirá que la inclusión de los ayudantes sea explícita por archivo en lugar de global.
ActiveAdmin.register MyModel do
controller do
include MyHelper
end
end
Puede definirlos en la aplicación / ayudantes / como lo intentó, pero debe incluirlos a través del inicializador del administrador activo de esta manera:
# in config/initializers/active_admin.rb
ActiveAdmin.setup do |config|
....
end
module ActiveAdmin::ViewHelpers
include ApplicationHelper
end
Puedo hacer que funcione en ActiveAdmin 0.6.1 (¡finalmente!). La solución es crear un módulo auxiliar de la siguiente manera:
# 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
luego incluya este módulo de esta manera:
# app/admin/[resource].rb
include ActiveAdminHelpers
ActiveAdmin.register [Resource] do
...
end
En realidad, no es una buena solución, pero está SECA y funciona bien. Ya he leído y probado muchos métodos y soluciones como el módulo ViewHelpers (puesto en ''app / helpers'' o ''app / admin / active_admin''), ActiveAdmin :: DSL monkey patching, ... pero esos nunca funcionaron en la versión 0.6.1 (no tengo ninguna idea sobre otras versiones) :(
También puedes usar los parciales de ActiveAdmin:
render partial: ''admin/my_partial'', locals: { var: my_var }
Y dentro de app/views/admin/_my_partial.html.arb
_my_partial.html.arb tu active_admin ruby code.
Usando activeadmin 1.0.0.pre1 desde git: //github.com/activeadmin/activeadmin.git
Rieles 4.2.1
Esto funcionó para mí ...
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 %>
app/helpers/active_admin/view_helpers.rb
no me ayudó
EDITADO: lo cambié a views_helper.rb y ViewsHelper en consecuencia y funcionó
* pero si quieres definirlo solo para cierto recurso, puedes hacerlo a mi manera
tuve que definir
#app/helpers/active_admin/categories_helper.rb
module ActiveAdmin::CategoriesHelper
def helper_method
end
end
para mi aplicación de recurso active_admin / admin / categories.rb