2014-12-06 2 views
0

У меня есть вложенный ресурс, как так:рельсов оказывают действие с вложенным маршрутом

resources :contacts do 
    resource :leads 
end 

Когда я сделать вид редактирования, URL-адрес выглядит так:

http://localhost:3000/contacts/1/leads/1 

Когда я отправить форму и он идет к проводникам действие обновления контроллера:

def update 
    if @lead.update_attributes(lead_params) 
     redirect_to contact_lead_path(@lead.contact, @lead) 
    else 
     render :edit 
    end 
    end 

Когда еще срабатывает, она отображает страницу, как так:

http://localhost:3000/leads/1 

, когда он должен быть:

http://localhost:3000/contacts/1/leads/1/edit 

Почему не делает "визуализация: редактировать" счета для полной вложенной URL? Как я могу это решить?

+0

затем попытайтесь использовать redirect_to edit_contact_lead_path (@ lead.contact, @lead) – rjackson

+0

@rjackson yes Я уже знаю, что это может быть достигнуто с помощью redirect_to. Но я не хочу перенаправлять. Я просто хочу сделать. Будет ли я вынужден сделать перенаправление здесь? – Donato

+0

Я так не думаю. Это ДОЛЖНО работать, как у вас здесь. EDIT: Упс, моя ошибка. Кажется, я вижу проблему. –

ответ

0

Посмотрите, как ваша форма создается на ваш взгляд. Это должно быть что-то вроде следующего. При использовании вашего метода LeadsController#edit необходимо загрузить как @contact так и @lead.

<%= form_for [@contact, @lead] do |f| %> 
    ... 
<% end %> 

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

Кроме того, я полагаю, это была опечатка, но в вашем вопросе, вы объявить вложенной маршрут как

resource :leads 

вместо

resources :leads 

Сингулярный resource действует, но означает нечто иное, чем то, что вы здесь намереваетесь, то есть каждый contact имеет один связанный lead.

0

При использовании render URL-адрес, отображаемый в адресной строке, будет URL-адресом, который был отправлен пользователю при отправке формы. В случае вашей формы, это выглядит как URL форма редактирования подчиняется является:

PATCH /leads/1

Когда вы render, он в основном посылает поток контента в ответ на эту просьбу. Поэтому, если вы хотите, чтобы ваш render :edit звонил в /contacts/1/leads/1/edit, вам необходимо определить маршрут, который отвечает на PATCH /contacts/1/leads/1/edit, и сопоставить это с вашим действием leads#update, а затем указать URL-адрес вашей формы на этот адрес. Но я бы посоветовал это сделать, так как вы отклонялись от соглашений Rails.

Смежные вопросы