2010-11-28 11 views
1

新しいビューではなくインデックスページに新しいアイテムを作成するためのフォームを作成しようとしているときに、私は不思議な問題に遭遇しました。サムビューでアイテムを作成して表示

現在のプロジェクトで新しいタスクを作成するためのフォームを表示するとき、下のリストに表示されるはずのタスクを含む@tasks変数は空のようです。したがって、私は "No route matches"を取得します。 complete_project_task_pathはnilです。

フォームを削除すると、すべてがチャームのように機能します。これがどうして起こるのか?

<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 --> 

答えて

1

なぜ@tasksで、@project.tasksではないのですか?フォームに作成した新しいタスクが表示されるからです。

さて、あなたはまだ@project.tasksを使用してのような何か行うことができます:タイトルなしでタスクをスキップするでしょう

<% @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 %> 

を。

@tasks変数が空であるため、エラーは発生しません。なぜなら、その場合は、その変数の下のコードには絶対にアクセスしないからです。あなたが得るエラーはあなたの@tasksの中の項目の1つが期待していない値を含んでいるということです。私はそれはtaskの何かが正しく設定されていないことを確認するあなたのcomplete_project_task_path(@project, task)と関係があると思いますか?

0

だから私はそれを理解したと思う。 (イム間違っている場合、私を修正してください)

Rubyの変数は オブジェクトと=オペレータコピー 参照への参照を保持します。

http://ruby-doc.org/docs/Newcomers/ruby.html#objectsからのNO。17)

アカウントにそれをとると、以下の例で

@task_list = @project.tasks 

を見てこれは本質的@task_list@project.tasksと同じオブジェクトを参照することができます。 @project.tasksのデータが変更された場合は、両方とも同じオブジェクトを指しているため、@task_list'sデータも変更されます。

@project.tasks.buildは、どちらも@project.taks@task_listの両方を指しているオブジェクトを変更するようです。

解決策はかなりシンプルでした。 @task_list = @ project.tasksを設定する代わりに、@task_listの新しいオブジェクトを作成しました。これを行うためのコントローラ、isteadでそう

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

はちょうどこのようにそれを実行します。これは働くだろうが

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

、あなたがコピーしている/再実装関連のコードを、あなたはすでに持ってる。私が提供するソリューションは、リスト内の新しいオブジェクトを無視し、通常はあなたが望むものを正確に実行します。 – nathanvda

関連する問題