2015-05-03 2 views
0

У меня есть этот маршрут:Новый вложенный ресурс с link_to

resources :projects do 
    resources :services 
    resources :contacts 
    resources :title_abstracts 
    resources :parcels 
    resources :leases 
    resources :documents 
end 

это в моих проектах Вид, чтобы добавить новый контакт к проекту:

new_project_contact_path(@project) 

URL, вырабатываемого: http://localhost:3000/projects/15/contacts/new

А Контакты Контроллер:

def new 
    @project = Project.find(params[:project_id]) 
    @contact = @project.contacts.build 
end 

def create 
    @project = Project.find(params[:project_id]) 
    @contact = @project.contacts.build(params[:contact]) 
    @contact.save 

    redirect_to project_path 
end 

Но я получаю следующее сообщение об ошибке:

Couldn't find Project with 'id'= 

Что я делаю неправильно? Как я должен проверить это?

+0

Вы должны, вероятно, дезинфицировать 'params [: contact]'. И какова линия, вызывающая ошибку? Это ('@contact = @ project.contacts.build (params [: contact])')? – potashin

+0

Вы уверены, что '@ project' в вашей ссылке (' new_project_contact_path (@project) ') не нуль? – AbM

+0

Это: @project = Project.find (params [: project_id]) – tbrooke

ответ

0

На ваших маршрутах.рб вы ввели :contacts в :projects. , но когда вы используете simple_form_for, вы не можете неявно объявить <%= simple_form_for @contact do |f| %>. Вы должны передать url:{controller: :contacts, action: :create, project_id:@project.id} в качестве аргумента вместе с новым экземпляром @contact в simple_form_for. так что params[:project_id] будет доступен в вашем контроллере.

Если вы действительно хотите использовать <%= simple_form_for @contact do |f| %>, вам нужно добавить
resources :contacts в файл routes.rb но вы должны оптимизировать свой код контроллера действий для требуемой маршрутизации. Я думаю, это поможет вам. Спасибо.