2011-07-17 16 views
36

Estoy usando Active Admin para proporcionar un administrador a algunos modelos. Necesito proporcionar un nuevo formulario personalizado para uno de ellos, pero deje el formulario de edición como predeterminado proporcionado por Active Admin. Esto es lo que tengo. Funciona en que me está dando la nueva forma que quiero, sino el formulario de edición también está utilizando la nueva forma, que no es lo que quiero:Administrador activo: personalizar solo el nuevo formulario

ActiveAdmin.register Document do 
    form :partial => 'form' 
end 

He intentado esto, pero le da un error que 'nuevo' es un método no definido:

ActiveAdmin.register Document do 
    new do 
    form :partial => 'form' 
    end 
end 

Respuesta

11

que he descubierto una manera de hacerlo con algo de lógica en la vista. No es la mejor manera, sin duda, pero hace lo que quiero hasta que encuentre una mejor manera. Esta es la lógica que estoy usando:

<% if controller.action_name == 'new' %> 
new form 
<% else %> 
edit form 
<% end -%> 
+1

Tiene que haber una mejor manera de hacer esto y me gustaría saber lo que es! esto me está plagando en este momento. – sorens

+1

@sorens: no en la versión actual de Active Admin. Deberá separar los formularios en la lógica de vista, ActiveAdmin no distingue entre edición y forma nueva. – eugen

2

No estoy seguro de que se puede hacer directamente con form. Si echa un vistazo al code, verá que solo se tiene en cuenta la última llamada. Por otro lado, puede intentar algo como:

config.set_page_config :new do 
    form :partial => 'form' 
end 

Pero prefiero pedirle a los desarrolladores esta característica.

78

Si lo que desea es ocultar o mostrar ciertos campos de la nueva forma (por ejemplo, un campo que se genera de forma automática en el modelo utilizando before_create), se puede hacer esto:

form do |f| 
    f.inputs "Member Details" do 
     f.input :first_name 
     f.input :last_name 
     f.input :email 
     if !f.object.new_record? 
      f.input :password 
      f.input :password_confirmation 
     end 
    end 
    f.button :Submit 
end 

Esto ocultará la contraseña campos cuando crea un nuevo miembro en caso de que genere contraseñas automáticamente la primera vez que se crea el miembro.

+7

'f.object.new_record?' ¡Funciona muy bien para mí! – Frexuz

+1

Por alguna razón, si pruebo esto, mi nueva forma está bien, pero mi formulario de edición ahora no tiene campos. ¿Alguna sugerencia? –

+0

Parece que me funciona si especificas la cláusula if y else de ... new_record? : 'if f.object.new_record? f.input: correo electrónico else f.input: correo electrónico f.input: contraseña f.input: password_confirmation end' – Jan

0

Puede crear una página personalizada que actúe como el nuevo formulario, renderice un parcial que contenga un código de formulario arbitrario.

Así, en el directorio de administración que crea un archivo que contiene new_document.rb

ActiveAdmin.register_page "New Document" do 

    content do 
     panel "Create a new document" do 
     render :partial => "admin/documents/custom_form", :locals => {document: Document.new} 
     end 
    end 

    end 

Luego, se coloca el formulario de Formtastic arbitrario en admin/documents/custom_form y el controlador de la acción arbitraria aka collection_action en admin/documents.

Así que, básicamente, hacer los rieles normales, escribir cosas dentro del marco de activeadmin.

1

Si alguien quiere hacer diferentes parciales para las nuevas y editar las páginas que usted tiene que:

#app/admin/document.rb 
ActiveAdmin.register Document do 
    form partial: 'form' 
end 

#app/views/admin/documents/_form.html.erb 
<% if @document.new_record? %> 
    <%= render partial: "form_new", resource: @document %> 
<% else %> 
    <%= render partial: "form_edit", resource: @document %> 
<% end %> 

#app/views/admin/documents/_form_new.html.erb 
<%= semantic_form_for [:admin, @document], builder: Formtastic::FormBuilder do |f| %> 
    <%= f.semantic_errors %> 
    <%= f.inputs do %> 
    <%= f.input :name %> 
    <% end %> 
    <%= f.actions %> 
<% end %> 
Cuestiones relacionadas