在升级到3.1之前,我的一些路由在我的Rails 3.0.7应用程序中运行良好。
# routes.rb
resources :chapters do
resources :cards
end
resources :cards
使用这样的控制器代码:
def show
@book = Book.find(params[:book_id])
@chapter = Chapter.find(params[:id])
@card = @chapter.cards.new # for "new card" form thats displayed on this same page
respond_with(@chapter)
end
使用链接创建一个相当典型的脚手架生成视图:
<% @chapter.cards.each do |card| %>
<%= link_to 'Edit', edit_card_path(card) %>
<% end %>
现在,如果我尝试在浏览器中提取它,我会收到这样的错误:
No route matches {:action=>"edit", :controller=>"cards", :id=>#<Card id: nil, side1: nil, side2: nil, chapter_id: 6, created_at: nil, updated_at: nil>}
它显示ID为nil
,但这不正确,因为我可以在此记录上显示其他值。
为什么会这样?我该如何解决?
答案 0 :(得分:0)
看起来像嵌套模型在Rails 3.1中的工作方式有所改变。据我所知,调用@chapter.cards.new
会在@chapter.cards
堆栈的顶部添加一个空白卡片模型,它不习惯这样做。因此,我不必在同一个操作中调用@chapter.cards.new
并迭代@chapter.cards
数组,而是必须将它们分开:
def show
@book = Book.find(params[:book_id])
@chapter = Chapter.find(params[:id])
@card = Card.new
@card.chapter_id = @chapter.id
respond_with(@chapter)
end