2009-10-10 38 views
27

Tengo un formulario que se muestra de manera diferente según el parámetro con el que se llamó.Rieles: pasar parámetros con render: acción?

Ej.

testsite.local/users/new?type=client 

Así que si type era a o b, la forma sería mostrar diferentes campos.

Mi problema es cuando el formulario se rellena incorrectamente, porque si el usuario no se puede guardar de forma paralela, muestra el formulario con los mensajes de error predeterminados, pero también sin mi parámetro.

testsite.local/users/new 

¿Cómo puedo llamar a mi render acción y pasar a lo que sea este parámetro se establece en a ella? ¿De modo que aún puedo mantener mis mensajes de error integrados sobre por qué el formulario no pudo ser ejecutado correctamente Y que sea la forma correcta?

Aquí es mi create acción:

def create 
    @user = User.new(params[:user]) 
    roles = params[:user][:assigned_roles] 
    if @user.save 
    update_user_roles(@user,roles) 
    if current_user.is_admin_or_root? 
     flash[:message] = "User \"#{@user.username}\" created." 
     redirect_to users_path 
    else 
     flash[:message] = "Congrats! You're now registered!" 
     redirect_to app_path 
    end 
    else 
    render :action => 'new' 
    end 
end 

Respuesta

18

Como dilucidada por otro usuario contestar a mi otra related question, esto es lo que yo buscaba:

form_for @user, :url => { :action => :create, :type => @type } 

... que conserva el parámetro :type a través de cada nueva acción render (suponiendo que lo tengo definido correctamente en mi controlador)

+1

¿Qué haces cuando quieres definir lo mismo para las acciones 'create' y' update'? – Victor

6

Extracto de Rieles Guías

Usando el procesamiento con: acción es una fuente frecuente de confusión para los recién llegados Rails. La acción especificada se utiliza para determinar qué objeto de render, pero los carriles no se ejecuta ninguna parte del código para que la acción en el controlador

Creo que su new?type=client se utiliza para configurar algún tipo de variable en su nueva acción? ¿Y la variable se usa más adelante en su vista new.html.erb?

Luego hay que cambiar un poco su acción de crear de esta manera:

else 
    # add code here to setup any variable for type = client 
    # and which will be used in your view 
    render :action => 'new' 
    end 
end 
+1

Bueno, esto aún rompe la consistencia visual de mi ruta de URL, de modo que, en caso de una presentación fallida de un formulario, la URL cambia de 'new? Type = client' a' new'. ¿No hay forma de establecer el parámetro url para la acción recién renderizada? ¿O todavía me falta algo aquí? – neezer

+0

wow, esto me causó mucha frustración. ¿Por qué no vuelve a cargar la nueva acción? Tengo que copiar/pegar código que no es óptimo. – Danny

3

Siempre se puede forzar por:

params[:type] ||= "client" 

en su nueva acción en su controlador. Si no se establece el tipo, se establecerá de forma predeterminada en el cliente. La URL no mostrará esto sin embargo.

+0

¿Hay ahora manera de que la URL muestre esto? – neezer

13

Hay dos formas de hacerlo.

O añadir un campo oculto o un parámetro adicional para el form_for

Adición de campo oculto en el formulario que contiene el tipo llamado y establezca su valor en params [: tipo] esto para conservar el tipo en el render si falla la validación .

Ver código:

<% form_for @user do |f| %> 
... 
<%= hidden_field_tag :type, params[:type] %> 
<%end%> 

Adición de un parámetro de extra para la forma:

<% form_for @user, create_user_path(@user, :type => params[:type]) %> 
... 
<%end%> 

Cualquiera de los dos hará lo que usted desea.

+0

¿Cómo diferenciaría la forma entre actualizar y crear? – Sean

Cuestiones relacionadas