2010-11-28 1 views
1

En essayant de créer un formulaire pour créer de nouveaux éléments sur une page d'index plutôt que sur la nouvelle vue, j'ai rencontré un problème étrange.Créer et afficher des éléments dans la vue de la réplique

Lors de la présentation du formulaire de création d'une nouvelle tâche dans le projet en cours, la variable @tasks contenant les tâches censées être affichées dans la liste ci-dessous semble être vide. Par conséquent, je reçois un "Aucune correspondance de route" depuis que l'objet im passant à IE. complete_project_task_path est nul. Lorsque vous supprimez le formulaire, tout fonctionne comme un charme.

Des idées pour lesquelles cela arrive?

<h1>Listing tasks</h1> 

<%= form_for([@project, @project.tasks.build]) do |f| %> 
    <div id="new_quick_task"> 
     <%= f.text_field :title, :value => 'Quickly add a new task' %> 
     <%= f.submit %> 
    </div> 
<% end %> 

<div id="task_list"> 
    <% @tasks.each do |task| %> 

     <div class="task"> 
      <div class="completed"><%= task.completed %></div> 
      <div class="complete_link"><%= link_to "Good", complete_project_task_path(@project, task) %></div> 
      <div class="title"><%= link_to task.title, project_task_path(@project, task) %></div> 
     </div> 
    <% end %> 
</div> <!-- end task_list --> 

Répondre

1

Pourquoi utilisez-vous @tasks et non @project.tasks? parce que cela montrerait la nouvelle tâche que vous avez créée pour votre forme?

Eh bien, vous pouvez toujours utiliser @project.tasks et faire quelque chose comme:

<% @project.tasks.each do |task| %> 
    <% unless task.title.nil? %> 
    <div class="task"> 
     <div class="completed"><%= task.completed %></div> 
     <div class="complete_link"><%= link_to "Good", complete_project_task_path(@project, task) %></div> 
     <div class="title"><%= link_to task.title, project_task_path(@project, task) %></div> 
    </div> 
    <% end %> 
<% end %> 

qui sauter les tâches sans le titre.

L'erreur que vous obtenez n'est pas parce que la variable @tasks est vide, parce que si c'était le cas, vous ne viendriez jamais au code ci-dessous. L'erreur que vous obtenez est que l'un des éléments à l'intérieur de votre @tasks contient une valeur à laquelle il ne s'attend pas. Je suppose que cela a quelque chose à voir avec votre complete_project_task_path(@project, task) qui va vérifier quelque chose de task qui n'est pas réglé correctement?

0

Donc, je pense que je l'ai compris. (S'il vous plaît me corriger si mal im)

les variables Ruby contenir des références à des objets et les copies = opérateur les références.

(de http://ruby-doc.org/docs/Newcomers/ruby.html#objects no. 17)

Compte tenu de cela, regardez l'exemple suivant

@task_list = @project.tasks 

Cela fait essentiellement @task_list se réfèrent au même objet que @project.tasks. Si les données de @project.tasks changent, les données @task_list's changent, car elles pointent toutes deux vers le même objet.

@project.tasks.build semble modifier l'objet, que les deux @project.taks et @task_list pointent vers, d'une certaine manière.

La solution était assez simple. Au lieu de définir @task_list = @ project.tasks, j'ai créé un nouvel objet pour @task_list.

Ainsi, dans le contrôleur, istead de le faire:

@project = Project.find(params[:project_id]) 
@task_list = @project.tasks 

faire exactement comme ceci:

@project = Project.find(params[:project_id]) 
@taks_list = Task.where(:project_id => @project.id) 
+0

Bien que cela fonctionnerait, vous copiez/re-mise en œuvre du code d'association que vous avez déjà avoir. La solution que j'offre ignorera le nouvel objet dans la liste et fait normalement exactement ce que vous voulez. – nathanvda

Questions connexes