Ruby on rails 在samve视图中创建和显示项目
在尝试构建表单以在索引页而不是新视图上创建新项时,我遇到了一个奇怪的问题 在当前项目中显示用于创建新任务的表单时,包含应显示在下面列表中的任务的@tasks变量似乎为空。因此,我得到一个“无路由匹配”,因为我传递给ie的对象。complete_project_task_路径为零 移除表单时,一切都像一个符咒。你知道为什么会这样吗Ruby on rails 在samve视图中创建和显示项目,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,在尝试构建表单以在索引页而不是新视图上创建新项时,我遇到了一个奇怪的问题 在当前项目中显示用于创建新任务的表单时,包含应显示在下面列表中的任务的@tasks变量似乎为空。因此,我得到一个“无路由匹配”,因为我传递给ie的对象。complete_project_task_路径为零 移除表单时,一切都像一个符咒。你知道为什么会这样吗 <h1>Listing tasks</h1> <%= form_for([@project, @project.tasks.build]
<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 -->
列出任务
'快速添加新任务'%>
为什么使用@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
中的一个项目包含它不期望的值。我猜这与您的完成项目任务路径(@project,task)
有关,它将检查未正确设置的任务的某些内容?为什么使用@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
中的一个项目包含它不期望的值。我猜这与您的完成项目任务路径(@project,task)
有关,它将检查任务中未正确设置的部分?所以我想我已经找到了答案。(如果我错了,请纠正我)
Ruby变量包含对
对象,并且=运算符复制
参考资料
(摘自第17号)
考虑到这一点,请看下面的示例
@task_list = @project.tasks
这本质上使@task\u list
引用与@project.tasks
相同的对象。如果@project.tasks
中的数据发生更改,@task\u列表的
数据也会发生更改,因为它们都指向同一个对象
@project.tasks.build
似乎改变了@project.taks
和@task\u list
以某种方式指向的对象
解决办法很简单。我没有设置@task\u list=@project.tasks,而是为@task\u list创建了一个新对象
因此,在控制器中,我不想这样做:
@project = Project.find(params[:project_id])
@task_list = @project.tasks
就这样做吧:
@project = Project.find(params[:project_id])
@taks_list = Task.where(:project_id => @project.id)
所以我想我明白了。(如果我错了,请纠正我)
Ruby变量包含对
对象,并且=运算符复制
参考资料
(摘自第17号)
考虑到这一点,请看下面的示例
@task_list = @project.tasks
这本质上使@task\u list
引用与@project.tasks
相同的对象。如果@project.tasks
中的数据发生更改,@task\u列表的
数据也会发生更改,因为它们都指向同一个对象
@project.tasks.build
似乎改变了@project.taks
和@task\u list
以某种方式指向的对象
解决办法很简单。我没有设置@task\u list=@project.tasks,而是为@task\u list创建了一个新对象
因此,在控制器中,我不想这样做:
@project = Project.find(params[:project_id])
@task_list = @project.tasks
就这样做吧:
@project = Project.find(params[:project_id])
@taks_list = Task.where(:project_id => @project.id)
虽然这会起作用,但您正在复制/重新实现已有的关联代码。我提供的解决方案将忽略列表中的新对象,并且通常会完全满足您的要求。虽然这会起作用,但您正在复制/重新实现已有的关联代码。我提供的解决方案将忽略列表中的新对象,并且通常完全按照您的要求执行。