0

因此,我对 Ruby on Rails 比较陌生,并且正在使用该语言构建一个项目管理系统,以便在我的大学进行独立研究。到目前为止,我已经创建了:

  • 一个用户可以创建多个项目的区域(http://i.imgur.com/pXOBg.png)
  • 在每个项目中,用户可以创建多个待办事项列表(http://i.imgur.com/FT3no.png
  • 在每个待办事项列表中,用户可以创建多个可以标记为完成/未完成的任务 (http://i.imgur.com/DMdcN.png)

一切都通过 SQLite DB 中的外键关联,并且工作相对良好,除了当我添加任务时。尽管该任务确实被添加到了待办事项列表中,但我被重定向到了一个不正确的 URL。我创建了与我的项目管理系统分开的待办事项列表应用程序,只是为了看看我如何创建它以及重定向以及一切工作正常,但将它实施到我的项目中证明有些麻烦。

这是遇到的问题:http: //i.imgur.com/Axuf2.jpg。URL 中的链接应该是http://localhost:3000/projects/2/lists/15,所以 ID 混淆了。显示的是http://localhost:3000/projects/15/lists/14其中 15 是列表的 ID,而不是项目,14 是任务的 ID,而不是列表。

我相信问题出在我的tasks_controller.rb中,其中包含以下内容:

class TasksController < ApplicationController

  attr_accessor :completed
  before_filter :find_list
  respond_to :html, :xml, :js

  def create
    @task = @list.tasks.new(params[:task])
    if @task.save
      flash[:notice] = "Task saved"
      redirect_to project_list_url(@list)
    else
      flash[:error] = "Task could not be saved"
      redirect_to project_list_url(@list)
    end
  end

  def complete
    @task = @list.tasks.find(params[:id])
    @task.completed = true
    @task.save
    redirect_to project_list_url(@list)
  end

  def incomplete 
    @task = @list.tasks.find(params[:id])
    @task.completed = false
    @task.save
    redirect_to project_list_url(@list)
  end

  def destroy
    @task = @list.tasks.find(params[:id])
    if @task.destroy
      flash[:notice] = "Task deleted"
      redirect_to project_list_url
    else
      flash[:error] = "Could not delete task"
      redirect_to project_list_url
    end
  end

  private 

  def find_list
    @list = List.find(params[:list_id])
  end

end

我认为问题出现在以下方面$link redirect_to project_list_url(@list),因为我认为它应该是$link redirect_to project_list_url(@project, @list)。但每次我添加:

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

对于我的代码,待办事项不会从已完成变为未完成,反之亦然。

这是我的待办事项列表视图中的代码:

<h3>Stuff to do</h3>
<ul>
  <% @list.tasks.incomplete.each do |task| %>
    <li><%= task.description %> <%= button_to "Complete", complete_task_path(@list.id,task.id) %></li>
  <% end %>
</ul> 

<h3>Stuff I've Done</h3>
<ul>
  <% @list.tasks.completed.each do |task| %>
    <strike><li><%= task.description %></strike> <%= button_to "Incomplete", incomplete_task_path(@list.id,task.id) %></li>
  <% end %>
</ul> 

<hr />

<%= form_for [@project, @list, @task] do |form| %>
  <p><%= form.text_field :description %> <%= form.submit %></p>

最后,快速浏览一下我的routes.rb

root :to => 'home#index'

devise_for :users

resources :projects do 
  resources :messages
  resources :lists do
    resources :tasks
  end
end

match 'lists/:list_id/tasks/:id/complete' => 'tasks#complete', :as => :complete_task
match 'lists/:list_id/tasks/:id/incomplete' => 'tasks#incomplete', :as => :incomplete_task

因此,ID 在 URL 中混合在一起,每当我编辑列表时它们也会这样做(尽管我想如果我可以为我可以为所有事情修复它的任务修复它)。

非常感谢任何看到这个并为我提供帮助的人,我非常感谢你所有的时间。如果您需要查看任何其他控制器、模型或视图(项目、列表、任务)或我项目中的任何内容,我将非常乐意分享。

4

2 回答 2

1

project_list_url(@list):这个路由助手有两个参数:一个项目和一个列表。尝试添加项目(或仅添加项目 ID):

redirect_to project_list_url(@list.project_id, @list)
于 2012-11-17T20:14:54.637 回答
0

乍一看,我认为将资源嵌套在 3 层以上是不合适的。您可以在此Ruby on Rails 指南中阅读更多内容。但是肯定会让你的生活更轻松的是 Jose Valim 的杰作inherit_resources 。它解决了很多嵌套资源的问题。

看来您在控制器中错过了一件更重要的事情:新动作。无论您有创建操作,您的新数据库记录都取决于“新”操作。

def new
 @list = List.find(params[:list_id])
 @task = Task.new
end

def create
 @list = List.find(params[:list_id])
 @task = @list.build(params[:task])
  if @task.save
   # success
  else
   # fail
  end
end

这就是创建关联背后的基本逻辑。

已编辑:我在“新”操作中看到了我的错误:而不是 @task = Task.new 它应该是 '@task = @list.tasks.new' 。

于 2012-11-17T20:27:12.057 回答