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
Pouvez-vous poster le formulaire complet? – Pavan
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
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 –