2011-08-11 15 views
6

Actualmente tengo un par de formularios en los que intento cambiar el botón que lo envía en función de si estoy en la edición o acción nueva. Tenía dos formularios creados pero esto olía mal, y ahora estoy usando solo un formulario parcial.Rails 3 - Formularios, Botón de envío personalizado según la acción?

Al final de mi parcial, que tienen algo como esto al final de mis formas:

<p> 
    <% if controller.action_name == 'new' %> 
    <%= f.submit "Create", :class => "pink_button"%> or 
    <% elsif controller.action_name == 'edit' %> 
    <%= f.submit "Update", :class => "pink_button"%> or 
    <% end %> 
    <%= link_to "cancel", :back %> 
    </p> 

esta manera, si estoy creando algunos nuevos, el botón dice "Crear", y si es una actualización que un usuario está intentando completar, el botón dice "Actualizar". Esto funciona muy bien, hasta que se envíe el formulario y la validación falle.

En mi controlador, me estoy poniendo cosas que fallan, así:

def update 
    @list = current_user.lists.find(params[:id])  

    if @list.update_attributes(params[:list]) 
     redirect_to list_path(@list), :notice => "List '#{@list.name}' updated." 
    else 
     render :action => 'edit' 
    end 
    end 

Así que la forma es simplemente re-renderizados. El problema es que ya no estoy en la ruta de edición. Esto significa que mi botón de formulario ya no aparece.

¿Existe una convención para lo que estoy tratando de hacer?

Gracias

Respuesta

14

Sí, esto se maneja en los carriles con i18n por defecto. Las traducciones están en ActionView, y se ven así:

en: 
    helpers: 
    select: 
     # Default value for :prompt => true in FormOptionsHelper 
     prompt: "Please select" 

    # Default translation keys for submit FormHelper 
    submit: 
     create: 'Create %{model}' 
     update: 'Update %{model}' 
     submit: 'Save %{model}' 

Todo lo que necesita hacer es f.submit (sin pasar a "Crear" o "Editar", etc) y las traducciones harán el resto. Puede sobrescribir estos dejando caer el yall anterior en sus configuraciones locales locales.

Si necesita establecer la clase, puede pasar el cero, p. f.submit nil, :class => 'whatev'

13

Los rieles manera es comprobar si el registro es nuevo o no:

@list.new_record? ? "Create" : "Update" 
+2

Gracias Sameer! Usé tu sugerencia de esta manera: <% = f.submit @ chore.new_record? ? "Publica tu tarea": ​​"Actualiza tu tarea",: class => "marginTopBottom"%> –

0

rieles tiene un método persisted? para determinar si un objeto ha persistido.

Si está utilizando erb, hacer

<%= f.submit (@list.persisted? ? 'Create' : 'Update) %> 

Si está utilizando haml, utilice

= f.submit (@list.persisted? ? 'Create' : 'Update') 

Para más información, véase el http://apidock.com/rails/ActiveRecord/Persistence/persisted%3F

Cuestiones relacionadas