Rails 3 создает нового потомка для конкретного родителя - PullRequest
1 голос
/ 29 мая 2011

Привет всем!Просто присоединился к переполнению стека, поскольку это был полезный ресурс, когда он начинал узнавать о Ruby on Rails 3.

Я не могу найти хотя бы один конкретный ответ, и, возможно, я лаюнеправильное дерево, насколько я знаю, но, надеюсь, вы, ребята, сможете разобраться со мной здесь.Сначала немного информации о том, с чем я работаю:- В моем веб-приложении у меня есть две модели: проекты и задачи в отношениях один ко многим.- Проекты имеют много задач, и задачи принадлежат проекту- Задачи НЕ вложенный ресурс, поскольку пользователи должны иметь возможность видеть все текущие задачи независимо от того, для какого проекта они предназначены.- routs.rb, следовательно, выглядит следующим образом: ресурсов: проектыресурсы: задачи

В представлении проекта отображается список задач, связанных с этим проектом.ниже указывается ссылка для создания новой задачи, которая выглядит следующим образом: <% = link_to 'Новая задача', new_task_path,: class => "new-btn"%>.Link_to переводит пользователя в новое представление для создания новой задачи.Представленное представление _form начинается с: <% = form_for (@task) do | f |%>.

Теперь, я думаю Мне нужно передать идентификатор проекта из представления проекта в новое представление задачи : но это то, где я теряюсь и, возможно,немного перепутано.

Может, кто-нибудь, пожалуйста, укажет мне правильное направление: может быть, на ресурс, описывающий все шаги, вовлеченные в это, или, возможно, даже предоставит описание шагов, вовлеченных в процесс, здесь.

Большое спасибо!

Ответы [ 5 ]

2 голосов
/ 29 мая 2011

Вы можете создавать вложенные маршруты и при этом иметь возможность показывать все задачи независимо от проекта.Просто убедитесь, что у вас уже определен ресурс задачи, например

resources :projects do |p|
  resources :tasks
end
resources :tasks

Теперь в индексах проектов или представлениях вы можете создать ссылку, например

link_to 'New Task', new_project_task_path(project)

Представление индекса задачи может быть немногосложно.Все зависит от того, как вы сортируете эти задачи.Если, например, вы показываете их отсортированными по проекту, вы можете создать ссылку, например

link_to 'New Task', new_project_task_path(task.project)

Что касается форм.В новом действии вы должны получить идентификатор из params и поместить его в объект задачи

if (params[:project_id])
  @task.project_id = params[:project_id]

В виде формы вы можете создать скрытое поле, в котором будет сохранено это значение

f.hidden :project_id

Это будетзаставить его работать, но вы не сможете перейти к новому заданию без предоставления проекта.Лучшим решением было бы создать поле со всеми проектами.Для этого вам необходимо сделать следующее:

в models / project.rb

def getProjectsList
  projects = Project.all
  projects.map do |p|
    [project.name, project_id]
  end
end

в controllers / application_controller.rb

def find_projects
  @projects = Project.new.getProjectsList
end

в controllers / tasks_controller.rb в начале

before_filter :find_projects, :only => [:new, :edit, :update, :create]

в представлениях / задачах / _form

f.select :project_id, @projects

Таким образом, вы всегда можете выбрать проект, и если в параметрах есть один, он будет уже выбран

1 голос
/ 31 мая 2011

Если current_user возвращает объект User, тогда вы сможете вызвать

current_user.projects 

, чтобы получить все проекты пользователя.

Определение отношения между пользователем и задачей может работать (хотя я не уверен в этом).

#models/user.rb
has_many :projects
has_many :tasks, :through => :projects

В этом случае просто

current_user.tasks 

должен возвращать задачи пользователя

0 голосов
/ 31 мая 2011

Вау!Спасибо за отличную информацию, ребята!Я определенно выучил несколько изящных приемов, пройдя через это.

Вот что я сейчас работаю:

rout.rb

resources :projects do |p|  
    resources :tasks  
end  
resources :tasks

IЯ действительно счастлив узнать, что эта часть возможна.Теперь я могу пользоваться преимуществами вложенного ресурса, но также использовать оригинальные не вложенные маршруты для задач.
ссылка в режиме просмотра проекта

<%= link_to 'New Task', new_project_task_path(@project), :class => "new-btn" %>

tasks_controller.rb новое действие

if (params[:project_id])
      @task.project_id = params[:project_id]
    end

скрытая область формы новой задачи

<%= f.hidden_field :project_id %>

Все это прекрасно работает для добавления новых задач в проекты: но, показывая список всех задач, связанных со всеми проектами, которые связаны стекущий пользователь был немного хитрее, и мне интересно, может быть, есть лучший способ, чем я придумал:

tasks_controller.rb в действии index

@projects = Project.find_all_by_user_id(current_user)
@tasks = Array.new
@projects.each do |p|
    p.tasks.each do |t|
        @tasks << t
    end
end

Я использую гемы "devise" и "cancan" для управления пользователями (оба были великолепны!).Выше «current_user» просто то, что вы ожидаете: зарегистрированный в данный момент пользователь.Это разумное решение, или есть лучший способ получить все задачи для пользователя?

На всякий случай:

User has_many Projects, and Project has_many Tasks
0 голосов
/ 29 мая 2011

Один из способов передачи идентификатора проекта со страницы проекта на страницу «Новая задача» - добавить его в строку запроса на вашем URL. Пример HTML будет выглядеть так:

<a href="/tasks/new?project_id=123" class="new-btn">New Task</a>

Чтобы Rails генерировал этот HTML, вы можете сделать это в своем ERB:

<%= link_to 'New Task', new_task_path(:project_id=>@project.id), :class => "new-btn" %>

Далее необходимо передать идентификатор проекта со страницы «Новая задача» в действие, которое фактически создает задачу. Один из способов сделать это - сделать скрытый ввод внутри формы, содержащий идентификатор проекта, чтобы он был передан вместе с другими параметрами при отправке формы. HTML будет выглядеть так:

<input type="hidden" name="project_id" value="<%= params[:project_id] %>" />

Для этого в Rails вы можете установить идентификатор проекта в новом действии задачи в TasksController:

@task.project_id = params[:project_id]

и затем сделайте что-то подобное в своем представлении внутри блока form_for (я не уверен на 100% в синтаксисе):

<%= f.hidden_field(:project_id) %>
0 голосов
/ 29 мая 2011

Есть много способов сделать это. Проще всего добавить параметр к вашей ссылке и использовать его в контроллере:

На ваш взгляд:

<%= link_to 'New Task', new_task_path(:project_id => @project.id), :class => "new-btn" %>

В ваших задачах контроллер:

def new
  @task = Task.new(:project_id => params[:project_id])
end
...