我正在开展一个 Rails 3 任务演示项目,其中Project
的每个实例都有很多tasks
,而Task
的实例属于一个project
。但是,后一种关系是可选的,尽管它在Task
模型中定义为belongs_to :project
。
基本上,我希望能够拥有如下路线:
example.com/tasks/1
example.com/tasks/new
example.com/project/1/tasks/1
example.com/project/1/tasks/new
我不确定这是否可行,甚至是不好的做法。对我来说,最重要的是能够在tasks#index
行动中创建无项目任务,以及project#show
行动中属于项目的任务,通过指向new
的链接动作。
我读过Rails Routing from the Outside In,但它并没有真正解释我的目的。
非常感谢任何帮助。
答案 0 :(得分:3)
这实际上比你想象的更常见。这是一个解决方案:
class TasksController < ApplicationController
before_filter :get_project
before_filter :get_tasks
private
def get_project
@project = Project.find(params[:project_id]) if params[:project_id]
end
def get_tasks
@tasks = (@project) ? @project.tasks : Task
end
end
从那里开始,当你想要完成任务时,你总是会引用@tasks。
举个例子:
def new
@tasks.new(params[:task])
end
无论您是否嵌套,都会产生正确的结果。
在嵌套的情况下,它就像调用:
@projects.tasks.new(params[:task])
并且没有嵌套,就像调用:
Task.new(params[:task])
答案 1 :(得分:0)
路线与协会无关。您可以拥有自己喜欢的任何路线,即使您没有任何关联。你的路线似乎很好。
该协会是一件方便的事情。它使程序员的生活更轻松。如果你甚至需要写一些类似的东西:
task.projects
然后,您必须在任务/项目之间建立has_many(或其他)关联。这有很多是允许你做task.projects的那个。如果您没有关联,则必须使用查找程序。