Je modèle à trois niveaux:emboîtées fields_for text_area n'affiche
utilisateur has_many Demande has_many Résultats
Sur la page d'accueil, je voudrais que l'utilisateur soit en mesure d'ajouter un résultat à leur Demandez quand ils le marquent complet. J'essaie d'utiliser un formulaire imbriqué pour afficher la description Outcome dans le formulaire Ask qui met également à jour le drapeau done et la date de fin.
Comme d'autres utilisateurs/questions ici sur SO, je ne peux pas obtenir un formulaire imbriqué à afficher sur l'écran. J'ai suivi les instructions des autres questions, mais le champ imbriqué ne s'affiche toujours pas. Je me demande si quelqu'un peut repérer le problème dans le code ci-dessous?
Demandez Modèle
class Ask < ActiveRecord::Base
attr_accessible :category, :description, :done, :followed_up,
:helper, :public, :date_done, :date_followed_up, :user_id, :outcomes_attributes
belongs_to :user, counter_cache: true
has_many :outcomes
accepts_nested_attributes_for :outcomes
end
Demandez contrôleur
class AsksController < ApplicationController
def new
@ask = current_user.asks.build(params[:ask])
@ask.outcomes.build
end
def create
@ask = current_user.asks.build(params[:ask])
if @ask.save!
respond_to do |format|
format.html { redirect_to edit_ask_path(@ask) }
format.js
end
else
flash[:error] = "Something is wrong. The Ask was not saved..."
end
end
def edit
@ask = current_user.asks.find(params[:id])
end
def update
@ask = current_user.asks.find(params[:id])
@ask.outcomes.build
@ask.update_attributes(params[:ask])
respond_to do |format|
format.html { redirect_to edit_ask_path(@ask) }
format.js
end
end
end
Page d'accueil Contrôleur(ce formulaire est sur la page d'accueil)
class StaticPagesController < ApplicationController
def home
if signed_in?
@ask = current_user.asks.build(params[:ask])
@ask.outcomes.build
end
end
Forme partielle rendu sur la page d'accueil
<% if current_user.asks.any? %>
<ul id="ask-list-items">
<% current_user.asks.where(done: false).each do |a| %>
<%= form_for(a) do |f| %>
<li><%= a.description %></li>
<%= f.hidden_field :date_done, value: Date.today %>
<%= f.hidden_field :done, :value=>true %>
<%= f.submit "Mark as done", class: "btn btn-small hidden done_btn", id: "a-#{a.id}-done" %>
<%= f.fields_for :outcomes do |builder| %> # << These fields are not showing up
<%= builder.text_area :description, placeholder: "Describe the outcome...", id: "ask-message" %>
<% end %>
<%= f.submit "Save outcome", class: "btn btn-primary" %>
<% end %>
<% end %>
</ul>
<% end %>
Je ne sais pas si la magie de Rails est de comprendre en quelque sorte que: les résultats est une association à la objet parent, dans ce cas à partir de la variable locale 'a'. Sinon, vous devez insérer '<% @outcomes = a.outcomes%>' avant votre appel de 'fields_for: outcomes' (en gardant': outcomes' dans cette ligne). – 244an
Grand appel. Tu étais proche. J'ai ajouté <% @outcomes = a.outcomes.build%> et cela a fonctionné. S'il vous plaît faites votre commentaire une réponse et je vais marquer comme résoudre mon problème. Je vous remercie. – kwh941
J'ai une ancienne version de Rails donc je n'étais pas sûr à 100%, merci. – 244an