0

以下に説明するように、編集リンクをクリックして表示ページからサブリソース(レッスン)を編集しようとすると、ネストされたルーティングに問題が発生します。関係するクラスは2つあります:ユニットとレッスン。Railsがコースコントローラ(ユニットの親)にルーティングしようとしている理由がわかりません。

どんな助けでも大歓迎です。

このエラーとURLが表示されます

http://localhost:3000/units/3/lessons/13/edit
Routing Error

No route matches {:action=>"show", :controller=>"courses", :id=>nil}

config / routers.rb リソース:コースはリソースを実行します:ユニットは終了します

resources :units do
    resources :lessons
end

**レーキルートから**

    unit_lessons GET    /units/:unit_id/lessons(.:format)            lessons#index
                 POST   /units/:unit_id/lessons(.:format)            lessons#create
 new_unit_lesson GET    /units/:unit_id/lessons/new(.:format)        lessons#new
edit_unit_lesson GET    /units/:unit_id/lessons/:id/edit(.:format)   lessons#edit
     unit_lesson GET    /units/:unit_id/lessons/:id(.:format)        lessons#show

クリックされたリンクのコード

<%= link_to "Edit Lesson", edit_unit_lesson_path(@unit, @lesson ) %>

LessonsController

class LessonsController < ApplicationController
  before_filter :find_unit
  before_filter :find_lesson, :only => [:show,:edit,:update,:destroy]
  .
  .
  .
private
def find_unit
  @unit = Unit.find(params[:unit_id])
end

def find_lesson
  @lesson = @unit.lessons.find(params[:id])
end

サーバーログファイル

Started GET "/units/3/lessons/12/edit" for 127.0.0.1 at 2012-08-02 14:50:55 +0200
Processing by LessonsController#edit as HTML
    Parameters: {"unit_id"=>"3", "id"=>"12"}
    Unit Load (0.1ms)  SELECT "units".* FROM "units" WHERE "units"."id" = ? LIMIT 1  [["id", "3"]]
Lesson Load (0.1ms)  SELECT "lessons".* FROM "lessons" WHERE "lessons"."unit_id" = 3 AND     "lessons"."id" = ? LIMIT 1  [["id", "12"]]
Rendered lessons/_form.html.erb (3.4ms)
Rendered lessons/edit.html.erb within layouts/application (4.4ms)
Completed 500 Internal Server Error in 7ms

ActionController::RoutingError (No route matches {:action=>"show", :controller=>"courses", :id=>nil}):
app/views/lessons/edit.html.erb:8:in   `_app_views_lessons_edit_html_erb___3830769233446763788_70188197130200'
4

1 に答える 1

0

それを見つけた。リンクは、.eachイテレータで構築されたテーブル本体の一部でした。名前を「@lesson」から「lesson」に変更する必要がありました。これは、テーブルの作成時に参照される名前です。

同様の問題に悩まされている他の人のために、私は機能するコードを以下に置きました。

<tbody>  
  <% @unit.lessons.each do |lesson| %>
    <tr>
      <td><%= link_to lesson.lesson_name, [@unit, lesson] %></td>
      .
      .
      .
      <td><%= link_to 'Edit', edit_unit_lesson_path(@unit, lesson ) %></td>
   </tr>
 <% end %>
 </tbody>
于 2012-08-02T21:07:47.990 に答える