2012-11-26 5 views
0

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 %> 
+0

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

+0

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

+0

J'ai une ancienne version de Rails donc je n'étais pas sûr à 100%, merci. – 244an

Répondre

3

Lorsque vous utilisez le symbole dans form_for et fields_for Rails tente d'utiliser une variable d'instance avec lui même nom, par exemple @outcomes pour :outcomes. Donc, essayez (pour les résultats existants):

<% @outcomes = a.outcomes %> 

avant la ligne avec f.fields_for :outcomes....

Et pour les nouveaux résultats:

<% @outcomes = a.outcomes.build %> 

(la dernière avec une contribution au propriétaire de la question)

+0

Utilisez-vous '<% @outcomes = a.outcomes.build%>' juste avant la ligne avec 'fields_for'? (c'est-à-dire le faire pour chaque "a") – 244an