2017-07-18 5 views
1

J'ai un parent "Comptes" qui a beaucoup de "Priorités".Mettre à jour l'association d'enfants dans Ruby on Rails Formulaire

Je peux très facilement créer de nouvelles priorités pour ces comptes, mais je ne peux pas les éditer/les mettre à jour une fois que je les ai créés.

modèle de compte (parent):

class Account < ApplicationRecord 
    has_many :priorities 
    accepts_nested_attributes_for :priorities 
end 

modèle priorités (enfant):

class Priority < ApplicationRecord 
    belongs_to :account 
end 

Routes:

resources :accounts do 
    resources :priorities 
    end 

priorities_controller.rb (juste le modifier, mettre à jour et params)

class PrioritiesController < ApplicationController 

    def edit 
    @account = Account.find(params[:account_id]) 
    @priority = @account.priorities.find(params[:id]) 
    end 

    def update 
    @account = Account.find(params[:account_id]) 
    @priority = @account.priorities.update(priority_params) 

    end 

    private 
    def priority_params 
     params.require(:priority).permit(:name, :narrative, :kpis) 
    end 

end 

et enfin, mon edit.html.erb (si cela finit par être des comptes/#/priorités/#/modifier) ​​

<%= form_for(@account) do |a| %> 

<%= a.fields_for :priorities, @priority do |p| %> 
    <p> 
    <%= p.label :name %><br> 
    <%= p.text_field :name %> 
    </p> 

    <p> 
    <%= p.label :narrative %><br> 
    <%= p.text_area :narrative %> 
    </p> 

    <p> 
    <%= p.label :kpis, "KPIs" %><br> 
    <%= p.text_field :kpis %> 
    </p> 

    <p> 
    <%= p.submit %> 
    </p> 
<% end %> 
<% end %> 

Tout va vraiment bien jusqu'à ce point. Le formulaire obtient parfaitement les données de formulaire pour la priorité correcte, et il échoue même si vous essayez d'entrer un ID de priorité qui n'est pas associé à cet ID de compte. Cependant, lorsque je clique sur « Mise à jour Priorité » Je reçois:

« L'action « mise à jour » n'a pas pu être trouvée pour AccountsController »

Maintenant, je peux suivre l'erreur et créer une mise à jour pour ce contrôleur, mais Je ne pense pas qu'il devrait même essayer de déclencher le AccountsController, il semble qu'il devrait essayer d'utiliser le contrôleur de priorités.

En effet, si je vérifie la console, la demande semble aller ici: URL de demande: http://127.0.0.1:3000/accounts/2

Je suis désolé, je suis recherche d'au moins 10 heures pour la réponse à cette question et peut ne le trouve pas. Merci de votre aide.

+0

Copie possible de [formulaire \ _pour des ressources imbriquées] (https://stackoverflow.com/questions/2034700/form-for-with-nested-resources) – jvillian

Répondre

0

Comme indiqué dans this réponse et this réponse, je crois que vous devez faire quelque chose comme:

<%= form_for [@account, @priority] do |f| %> 
    blah blah 
<% end %> 

(attribution équitable. Lifted directement de la deuxième liée réponse)

Comme vous le soulignez, ceci:

<%= form_for(@account) do |a| %> 

va générer une URL pour l'action update sur ladix . Parce que, c'est exactement comme ça que ça marche. Si vous voulez une URL pour la ressource imbriquée, vous devez inclure les deux variables d'instance dans la déclaration form_for.

+0

Ok, donc cela semble être la bonne direction, cependant Quand j'ai testé la mise à jour, elle a changé TOUTES les priorités dans ce compte - donc je dois avoir quelque chose de mal avec mon contrôleur. Je vous remercie. – Jake

+0

Oui, j'ai changé le contrôleur de mise à jour des priorités et cela a fonctionné. Merci beaucoup! – Jake