2010-11-28 49 views
1

嘗試構建表單以在索引頁上而不是新視圖上創建新項時,我遇到了一個奇怪的問題。在samve視圖中創建並顯示項目

在當前項目中呈現用於創建新任務的表單時,包含應顯示在下面列表中的任務的@tasks變量似乎爲空。因此,我得到一個「無路線匹配」,因爲對象im傳遞給ie。 complete_project_task_path爲零。

刪除表單時,一切都像魅力一樣。任何想法爲什麼發生這種情況

<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中的某個項目包含它不期望的值。我想這與你的complete_project_task_path(@project, task)有關,它會檢查task設置不正確的東西嗎?

0

所以我想我想通了。 (請糾正我,如果我錯了)

Ruby的變量堅持 對象和=運算符複製 引用引用。

(從http://ruby-doc.org/docs/Newcomers/ruby.html#objects無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 2010-11-29 13:18:52

相關問題