rails простая форма для вложенных маршрутов

Я пытаюсь создать simple_form_for в Rails 3.2 для @objects с двойным вложенным маршрутом, например:

/users/1/projects/2/objects

Форма:

<%= simple_form_for @object, :url => user_project_objects_path(@user, @project), :html => { :class => 'form-horizontal' } do |f| %>

В route.rb:

resources :users do
  resources :projects do
    resources :objects do
      collection { post :import }
    end
  end
end

Мой вопрос: что происходит в действиях new и create контроллера Object?

До сих пор - и я получаю ошибку маршрутизации - у меня есть:

def create
  @user = current_user
  @project = Project.find_by_user_id(@user)
  @object = @project.objects.build(params[:object])
  if @object.save
    flash[:notice] = "Object was successfully created"
    redirect_to user_project_objects_path
  else
    render 'new'
  end
end

def new
  @user = current_user
  @project = Project.find_by_user_id(@user)
  @object = @project.objects.build
end

Любые советы очень ценятся.

В ответ на Грег В:

No route matches {:action=>"edit", :controller=>"objects", :user_id=>#<Object id: 8, source_lang_id: 1, source_content: "Kaffehaus", target_lang_id: 2, target_content: "cafe", domain_id: 2, owner_id: nil, created_at: "2013-01-04 06:36:55", updated_at: "2013-01-04 06:36:55", project_id: 2>}

owner_id (пользователь, то есть текущий_пользователь) не обновляется - и это может быть проблемой (?)


person codervince    schedule 04.01.2013    source источник
comment
Можете ли вы предоставить ошибку маршрутизации? Это может быть результатом вашего вспомогательного URL-адреса user_project_objects_path после redirect_to. Вероятно, для указания идентификатора проекта требуется аргумент. то есть user_project_objects_path(@project).   -  person Greg W    schedule 04.01.2013
comment
Спасибо за ответ. Обновлено с ошибкой маршрутизации   -  person codervince    schedule 04.01.2013


Ответы (2)


В форме вы можете использовать

simple_form_for([@user, @project, object]) do

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

@project= current_user.projects

вместо

@project = Project.find_by_user_id(@user)
person Hitesh    schedule 04.01.2013
comment
current_user.projects вернет массив проектов. Меня интересует только проект, в котором я сейчас работаю. Заголовок simple_form_for эквивалентен приведенному выше предложению. Я считаю, что ответ заключается в том, как новая модель создает три переменные экземпляра и как они обновляются при создании объекта, чтобы включить user_id и project_id в хэш params. - person codervince; 04.01.2013

Я тем временем разобрался. Возможно, это может быть обычное руководство для других, работающих с двойной вложенной маршрутизацией, такой как пользователь -> проекты -> объекты (has_many, has_many)

В контроллере объекта Новое действие:

@user = current_user
@project = Project.find(params[:project_id])
@object = Object.new

В контроле объекта действие Create:

 @user = current_user
 @project = Project.find(params[:project_id])
 @object = @project.objects.build(params[:object])
 @object.owner_id = @user.id  #owner id maps to User

Ошибка маршрутизации возникла из-за того, что не были указаны все объекты, пользователь, проект и объекты в

user_project_objects_path(@project)
person codervince    schedule 07.01.2013