可选的belongs_to和Rails路由

时间:2011-04-10 23:54:01

标签: ruby-on-rails routing associations

我正在开展一个 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,但它并没有真正解释我的目的。

非常感谢任何帮助。

2 个答案:

答案 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的那个。如果您没有关联,则必须使用查找程序。