Rails: paramètres de passage avec render: action?
j'ai une forme qui s'affiche différemment selon le paramètre avec lequel elle a été appelée.
ex.
testsite.local/users/new?type=client
ainsi , si type
était a
ou b
, le formulaire afficherait des champs différents.
mon problème est quand le formulaire est rempli incorrectement, parce que si l'utilisateur ne pouvait pas être sauvegardé correctement, il rend le formulaire avec les messages d'erreur par défaut, mais aussi sans mon paramètre.
testsite.local/users/new
Comment puis-je appeler mon action render
et passer quel que soit le paramètre qui y est défini? Pour que je puisse toujours garder mes messages d'erreur intégrés sur la raison pour laquelle le formulaire n'a pas pu être fourni correctement et que ce soit le bon formulaire?
Voici mon create
action:
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
4 réponses
comme élucidé par un autre utilisateur répondant à mon autre question connexe , voici ce que j'étais après:
form_for @user, :url => { :action => :create, :type => @type }
... qui préserve le paramètre :type
à travers chaque nouvelle action de rendu (en supposant que je l'ai correctement défini dans mon contrôleur).
Il y a deux façons de le faire.
soit ajouter un champ caché ou un paramètre supplémentaire au form_for
Ajouter un champ caché dans votre formulaire contenant le type nommé et le mettre égal à params[:type] cela préservera le type sur le rendu si la validation échoue.
voir le code:
<% form_for @user do |f| %>
...
<%= hidden_field_tag :type, params[:type] %>
<%end%>
ajout d'un paramètre supplémentaire à la forme:
<% form_for @user, create_user_path(@user, :type => params[:type]) %>
...
<%end%>
L'un ou l'autre fera ce que vous le souhaitez.
extrait pour Guides de Rails
utiliser render with :action est une source fréquente de confusion pour les nouveaux Rails. L'action spécifiée est utilisée pour déterminer quelle vue doit être rendue, mais les Rails n'exécutent aucun code pour cette action dans le contrôleur
je crois que votre new?type=client
est utilisé pour configurer une variable dans votre nouvelle action?
Et la variable est utilisée plus tard dans votre nouvelle.HTML.erb?
alors vous devez changer un peu votre action Créer comme ceci:
else
# add code here to setup any variable for type = client
# and which will be used in your view
render :action => 'new'
end
end
, Vous pouvez toujours forcer par:
params[:type] ||= "client"
dans votre nouvelle action à votre contrôleur. Si le type n'est pas définie, alors il sera par défaut pour le client. L'URL ne sera pas montrer cela, cependant.