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
27
demandé sur neezer 2009-10-11 00:55:05

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).

18
répondu neezer 2017-05-23 10:29:27

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.

13
répondu EmFi 2012-07-31 17:21:26

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
6
répondu Aurélien Bottazini 2009-10-10 21:24:29

, 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.

3
répondu Ryan Bigg 2009-10-10 22:06:15