Мой проект позволяет семейной странице иметь несколько историй. Модели включают отношения - «Family has_many Stories» и «Story принадлежит семье». В файлеways.RB у меня есть следующее:
resources :families do
resources :stories
end
В результате следующие маршруты для контроллера историй:
family_stories GET /families/:family_id/stories(.:format) {:action=>"index", :controller=>"stories"}
POST /families/:family_id/stories(.:format) {:action=>"create", :controller=>"stories"}
new_family_story GET /families/:family_id/stories/new(.:format) {:action=>"new", :controller=>"stories"}
edit_family_story GET /families/:family_id/stories/:id/edit(.:format) {:action=>"edit", :controller=>"stories"}
family_story GET /families/:family_id/stories/:id(.:format) {:action=>"show", :controller=>"stories"}
PUT /families/:family_id/stories/:id(.:format) {:action=>"update", :controller=>"stories"}
DELETE /families/:family_id/stories/:id(.:format) {:action=>"destroy", :controller=>"stories"}
Вот соответствующие методы контроллера:
def edit
@story = @family.stories.find(params[:id])
end
def destroy
@story = @family.stories.find(params[:id])
@story.destroy
redirect_to family_stories_url, :notice => "Successfully destroyed story."
end
Для index.html.erb код, сгенерированный изящными скаффолдингами, не учитывает отношения, а ссылки для «Показать», «Редактировать» и «Разрушить» не работают. После некоторых исследований я изменил код для этих ссылок следующим образом:
<% for story in @stories %>
<tr>
<td><%= story.title %></td>
<td><%= story.body %></td>
<td><%= link_to "Show", [@family, story] %></td>
<td><%= link_to "Edit", edit_family_story_path([@family, story]) %></td>
<td><%= link_to "Destroy", [@family,story], :confirm => 'Are you sure?', :method => :delete %> </td>
</tr>
<% end %>
Ссылка "Показать" работает нормально при замене исходной переменной "story" на "[@family, story]". Ссылки «Удалить» и «Редактировать» не работают с аналогичными заменами.
Ссылка «Уничтожить» не вызывает ошибок, но действует так же, как ссылка «Показать» - запись не удаляется и вместо этого отображается (диалоговое окно: подтверждение никогда не отображается.) Ссылка «Редактировать» создает следующую ошибку:
"No route matches {:action=>"edit", :controller=>"stories", :family_id=>\#[Story id: 1, title: "story01 for family01", body: "body01 for story01 for family01", created_at: "2011-04-09 22:55:14", updated_at: "2011-04-09 22:55:14", family_id: 1]}"
Конструкция [@ family, story] хорошо работает для ссылки "Показать". Почему это не работает для ссылок "Редактировать" и "Разрушить"? Как мне изменить их для правильной работы?