2009-10-10 7 views
27

Ho un modulo che viene visualizzato in modo diverso a seconda del parametro con cui è stato chiamato.Rails: passa i parametri con render: action?

Es.

testsite.local/users/new?type=client 

Quindi, se type era a o b, la forma visualizzerebbe campi diversi.

Il mio problema è quando il modulo è compilato in modo errato, perché se l'utente non può essere salvato correttamente, rende il modulo con i messaggi di errore predefiniti, ma anche senza il mio parametro.

testsite.local/users/new 

Come posso chiamare il mio render azione e passare qualunque cosa questo parametro è impostato su di esso? In modo che possa ancora mantenere i miei messaggi di errore incorporati sul motivo per cui il modulo non può essere implementato correttamente E avere la forma corretta?

Ecco la mia create azione:

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 

risposta

18

Come chiarito da un altro utente di rispondere alla mia altra related question, ecco quello che è stato dopo:

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

... che conserva il parametro :type attraverso ogni nuova azione di rendering (supponendo l'ho definito correttamente nel mio controller).

+1

Cosa fai quando vuoi definire la stessa cosa per l'azione 'create' e' update'? – Victor

6

estratto per Rails Guide

Utilizzo di rendering con: l'azione è una frequente fonte di confusione per i nuovi arrivati ​​Rails. L'azione specificata viene utilizzato per determinare quale vista da rendere, ma Rails non viene eseguito alcun codice per quell'azione nel controller

Credo che la vostra new?type=client permette di configurare una sorta di variabile nella tua nuova azione? E la variabile viene successivamente utilizzata nella vista new.html.erb?

allora avete bisogno di cambiare un po 'la vostra azione creare in questo modo:

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

Bene, ciò interrompe ancora la coerenza visiva del mio percorso URL, in modo tale che, in seguito all'invio non riuscito di un modulo, l'URL cambia da 'new? Type = client' a solo' new'. Non c'è modo di impostare il parametro url per l'azione appena resa? O mi manca ancora qualcosa qui? – neezer

+0

wow, questo mi ha causato così tanta frustrazione. perché non ricarica semplicemente la nuova azione? Devo copiare/incollare il codice che non è ottimale. – Danny

3

Si può sempre forzare da:

params[:type] ||= "client" 

nella vostra nuova azione nel controller. Se il tipo non è impostato, verrà impostato come predefinito sul client. L'URL non mostrerà questo comunque.

+0

C'è un modo per mostrare l'URL? – neezer

13

Ci sono due modi per farlo.

O aggiungere un campo nascosto o di un parametro in più per il form_for

Aggiunta campo nascosto nel modulo che contiene il tipo di nome e impostarlo uguale a params [: tipo] questo conserverà il tipo sul rendere se la convalida non riesce .

Vista Codice:

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

Aggiunta di un paramater in più per la forma:

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

O si farà ciò che si desidera.

+0

Come distinguere il modulo tra l'aggiornamento e la creazione? – Sean