Необязательная принадлежность - PullRequest
3 голосов
/ 11 апреля 2011

Я работаю над демонстрационным проектом задачи 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.

Я прочитал Маршрутизация с внешней стороны , но это не объясняет, к чему я иду.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 11 апреля 2011

Это на самом деле чаще, чем вы думаете.Вот решение:

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])
0 голосов
/ 11 апреля 2011

Маршруты не связаны с ассоциациями.Вы можете иметь любые маршруты, которые вам нравятся, даже если у вас нет ассоциаций.И ваши маршруты кажутся хорошими.

Ассоциация - вещь удобства.Это облегчает жизнь программиста.Если вам даже нужно написать что-то вроде:

task.projects 

Затем вы должны иметь has_many (или другую) связь между задачами / проектами.Это имеет много того, что позволяет вам делать task.projects.Если у вас не было ассоциации, вам придется использовать поиск.

...