-1

J'ai donc un problème étrange que je n'arrive pas à comprendre. Fondamentalement params[:order_id] devient params[:orderS_id] lors de la soumission du formulaire qui provoque des erreurs si le formulaire échoue validations. J'utilise cocoon pour les formulaires imbriqués sur une page qui a des actions de contrôleur d'édition/mise à jour personnalisées (parce que j'ai besoin de contrôler différemment les soumissions réussies/échouées sur cette page que pour les mêmes formulaires sur d'autres pages).Params devient pluriel/incorrect sur le rendu après l'échec de la validation

params on page load

Started GET "/properties/99/orders/1/prop_order_wiz" for 127.0.0.1 at 
2017-08-20 17:33:41 -0400 
Processing by PropertiesController#prop_order_edit as HTML 
Parameters: {"property_id"=>"99", "order_id"=>"1"} 

Donc, la page se charge avec params[:order_id] comme prévu et j'utiliser cette valeur sous la forme suivante:

deeds form

<%= bootstrap_nested_form_for(@properties, url: prop_order_update_patch_path(@properties, @orders), method: "patch", layout: :horizontal) do |f| %> 
    ... 

    ## Cocoon fields_for _deeds_fields.html.erb... ## 
    <%= f.hidden_field :order_id, value: params[:order_id] %> 
    ## end cocoon ## 
    ... 
    <%= f.submit "Save Deeds", class: "btn btn-primary inline pull-right" %> 
<% end %> 

Lors de la première render page et un suc Soumettre soumettre, tout va bien. Toutefois, si le formulaire échoue validations, la page affichera params[:orders_id] ce qui laisse params[:order_id] vide, puis provoque des erreurs.

Je peux dire à partir de parameters soumis à travers le formulaire qu'il soumet avec orders_id => 1, au lieu de order_id => 1, pourquoi cela se produit-il?

form params (faites défiler la bonne façon de voir ce que je veux dire)

Parameters: {"utf8"=>"✓", "authenticity_token"=>"..", "property"=>{ "deeds_attributes"=>{"0"=>{"_destroy"=>"false", "property_id"=>"99", "order_id"=>"1", ..., "id"=>"1"}}}, "commit"=>"Save Deeds", "property_id"=>"99", "orders_id"=>"1"} 

après @properties.save échoue dans mon action de contrôleur Je vais appeler @orders = Order.find(params[:orders_id]) au-dessus du render mais quand il rend params[:order_id] est vide et params[:orderS_id] a l'information correcte.

J'ai pu contourner ce problème en appelant params[:orders_id] = params[:order_id] dans mon action de chargement initiale, mais cela ne semble pas être la bonne façon de procéder. Quelqu'un peut-il me dire pourquoi cela se produit et comment pour le réparer? Je vais inclure mes actions de contrôleur personnalisé ci-dessous pour plus de détails. Merci d'avance!

actions de contrôleur personnalisé

def prop_order_edit ## Initial page load 
    @properties = Property.find(params[:property_id]) 
    @orders = @properties.orders.find(params[:order_id]) 
    params[:orders_id] = params[:order_id] ## temp fix ## 
    render 'orders/orderprocess/prop_order_wiz' 
end 

def prop_order_update ## Custom update action for form submission 
    @properties = Property.find(params[:property_id]) 
    @orders = Order.find(params[:orders_id]) ## modified for temp fix 
    @properties.update_attributes(property_params) 
    respond_to do |format| 
    format.html { 
        if @properties.save 
        flash[:success] = "Order Updated Successfully" 
        redirect_to prop_order_wiz_path(@properties, @orders) 
        else 
        @orders = Order.find(params[:orders_id]) ## modified for temp fix 
        render 'orders/orderprocess/prop_order_wiz' 
        end 
       } 
    format.js { 
       if @properties.save 
        flash[:success] = "Order Updated Successfully" 
       else 
        @orders = Order.find(params[:orders_id]) ## modified for temp fix 
        flash.now[:danger] = "Unable to Update Order" 
        render 'orders/orderprocess/prop_order_wiz' 
       end 
      } 
    end 
end 
+0

Pouvez-vous poster le formulaire complet? – Pavan

+0

La commande 'bootstrap_nested_form_for' n'utilise pas cocoon mais' nested_form'. Donc, il vaut mieux ne pas les mélanger. De plus, ces deux gemmes sont assez obsolètes, je recommanderais plutôt 'simple_form' (qui a aussi le support de bootstrap). Quoi qu'il en soit: le problème n'est pas lié à 'cocoon' ou' nested_form' (construire un formulaire avec des attributs imbriqués) mais il est lié à la définition de vos routes (ou votre url de formulaire).Pourriez-vous expliquer ce que vous essayez de faire? Votre forme-url = 'prop_order_update_patch_path (@properties, @orders)' de sorte qu'il semble que vous vouliez remettre un tableau de commandes, d'où 'orders_id'. – nathanvda

+0

Ah intéressant de connaître les gemmes, merci pour cela. Je n'ai codé que sur des rails depuis environ 6 mois maintenant et la gemme 'bootstrap_form_for' était ce que j'ai choisi en premier quand j'ai commencé et en quelque sorte jamais changé. Fondamentalement '@ orders' appartient à' @ properites' donc la route est '/ properties /: property_id/orders /: order_id/prop_order_wiz' pour la série de formulaires utilisant les plugins' jQuery steps' pour remplir une 'commande'. Ce que j'essaie de faire est de passer ': order_id' sur le nouvel enregistrement' deed' qui a aussi 'belongs_to Property', et cela fonctionne bien au premier chargement mais si l'acte échoue à la validation il en résulte le résultat ci-dessus –

Répondre

0

On dirait que la relation entre modèle propriété et modèle est ordre has_many qui va générer au pluriel lors de la présentation du param forme. Si la propriété a une seule commande, vous devrez changer la relation à has_one et ensuite vous devrez changer les commandes pour commander, vous pouvez user order_id.

+0

Vous avez absolument raison, ** Property ** est 'has_many: orders' et ** Order ** est' belongs_to' pour ces associations. Je n'avais aucune idée que cela ferait une différence dans les paramètres, donc je suis content que vous l'ayez attrapé. Quel serait le meilleur moyen de rectifier la situation? –

+0

Pour clarifier, une «Propriété» peut avoir beaucoup de commandes. –