当我登录我的测验应用程序时,我应该被重定向到pages / user_home,但是我获取“#NoMethodError in Pages#user_home”“undefined method` each'for nil:NilClass”500 Internal Server错误,所以听起来它不知道我的@courses变量。
但疯狂的是:当我去localhost:3000 / pages / user_home在我的浏览器中它可以工作!
问题只有在我被重定向时才会出现。另外:当我尝试去我的路线页面(localhost:3000)时,它还会尝试将我重定向到pages / user_home。
这是我的routes.rb:
Rails.application.routes.draw do
get 'home/index'
devise_for :students
resources :sessions
get 'sessions/index'
resources :answers
resources :questions
resources :quizzes do
resources :quiz_sessions
end
resources :courses
devise_for :users
# Setup static pages
get "/pages/:page" => "pages#show"
devise_scope :user do
root to: 'pages#user_home'
match '/sessions/user', to: 'devise/sessions#create', via: :post
end
# root 'pages#show', page: "home"
root 'pages#home'
end
这是我的网页/ user_home.html.erb:
<h1>Your Courses</h1>
<%= render '/courses/list_desc', courses: @courses %>
以下是部分课程/ _list_desc.html.erb:
<table>
<thead>
<tr>
<th>Title</th>
<th>Semester</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% logger.debug "[DEBUG] Courses is nil? #{@courses.nil?}" %>
<% logger.debug "[DEBUG] Courses inspect: #{@courses.inspect}"%>
<% courses.each do |course| %>
<tr>
<td><%= course.title %></td>
<td><%= course.semester %></td>
<td><%= link_to 'Show', course %></td>
<td><%= link_to 'Edit', edit_course_path(course) %></td>
<td><%= link_to 'Delete', course, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% course.quizzes.each do |quiz| %>
<tr>
<td colspan="2"><p><%= quiz.title %></p></td>
<td><%= link_to 'Show', quiz %></td>
</tr>
<% end %>
<% end %>
</tbody>
</table>
这是我的pages_controller.rb:
class PagesController < ApplicationController
def show
@courses = Course.all.order("SUBSTR(semester, 3, 2) DESC, SUBSTR(semester, 1, 2) ASC")
logger.debug "[DEBUG] Courses is nil? #{@courses.nil?}"
logger.debug "[DEBUG] Courses inspect: #{@courses.inspect}"
#if current_user.present?
# @quiz_session = current_user.quiz_session
#else
#end
if valid_page?
render template: "pages/#{params[:page]}"
else
render file: "public/404.html", status: :not_found
end
end
private
def valid_page?
File.exist?(Pathname.new(Rails.root + "app/views/pages/#{params[:page]}.html.erb"))
end
end
这些是courses_controller.rb的show和index方法:
def index
@courses = Course.all
end
# GET /courses/1
# GET /courses/1.json
def show
@course = Course.find(params[:id])
end
登录后重定向时development.log:
Started GET "/" for ::1 at 2017-04-22 10:35:27 +0200
Processing by PagesController#user_home as HTML
[1m[36mUser Load (0.0ms)[0m [1m[34mSELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?[0m [["id", 3], ["LIMIT", 1]]
Rendering pages/user_home.html.erb within layouts/application
[DEBUG] Courses is nil? true
[DEBUG] Courses inspect: nil
Rendered courses/_list_desc.html.erb (8.0ms)
Rendered pages/user_home.html.erb within layouts/application (13.0ms)
Completed 500 Internal Server Error in 45ms (ActiveRecord: 0.0ms)
ActionView::Template::Error (undefined method `each' for nil:NilClass):
10: <tbody>
11: <% logger.debug "[DEBUG] Courses is nil? #{@courses.nil?}" %>
12: <% logger.debug "[DEBUG] Courses inspect: #{@courses.inspect}"%>
13: <% courses.each do |course| %>
14: <tr>
15: <td><%= course.title %></td>
16: <td><%= course.semester %></td>
app/views/courses/_list_desc.html.erb:13:in `_app_views_courses__list_desc_html_erb__702092917_100240656'
app/views/pages/user_home.html.erb:6:in `_app_views_pages_user_home_html_erb__618789178_100320468'
Rendering B:/Programme/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actionpack-5.0.2/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout
Rendering B:/Programme/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actionpack-5.0.2/lib/action_dispatch/middleware/templates/rescues/_source.html.erb
Rendered B:/Programme/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actionpack-5.0.2/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (4.0ms)
Rendering B:/Programme/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actionpack-5.0.2/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb
Rendered B:/Programme/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actionpack-5.0.2/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.0ms)
Rendering B:/Programme/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actionpack-5.0.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb
Rendered B:/Programme/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actionpack-5.0.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.0ms)
Rendered B:/Programme/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actionpack-5.0.2/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout (396.1ms)
转到localhost时的development.log:3000 / pages / user_home:
Started GET "/pages/user_home" for ::1 at 2017-04-22 11:01:58 +0200
Processing by PagesController#show as HTML
Parameters: {"page"=>"user_home"}
[1m[36mUser Load (0.0ms)[0m [1m[34mSELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?[0m [["id", 3], ["LIMIT", 1]]
[DEBUG] Courses is nil? false
[1m[36mCourse Load (0.0ms)[0m [1m[34mSELECT "courses".* FROM "courses" ORDER BY SUBSTR(semester, 3, 2) DESC, SUBSTR(semester, 1, 2) ASC[0m
[DEBUG] Courses inspect: #<ActiveRecord::Relation [#<Course id: 3, title: "Einführung in das Programmieren", user_id: 2, access_key: "", created_at: "2017-03-19 22:13:45", updated_at: "2017-03-19 22:13:45", semester: "AS18">, #<Course id: 1, title: "Betriebssysteme", user_id: 2, access_key: "e9wjzznkgml6", created_at: "2017-03-19 01:35:37", updated_at: "2017-03-19 01:39:55", semester: "SS17">, #<Course id: 2, title: "Betriebssysteme", user_id: 2, access_key: "", created_at: "2017-03-19 21:08:58", updated_at: "2017-03-19 21:08:58", semester: "WS17">, #<Course id: 4, title: "Einführung in das Programmieren", user_id: 2, access_key: "", created_at: "2017-03-19 22:14:06", updated_at: "2017-03-19 22:14:06", semester: "SS16">]>
Rendering pages/user_home.html.erb within layouts/application
[DEBUG] Courses is nil? false
[DEBUG] Courses inspect: #<ActiveRecord::Relation [#<Course id: 3, title: "Einführung in das Programmieren", user_id: 2, access_key: "", created_at: "2017-03-19 22:13:45", updated_at: "2017-03-19 22:13:45", semester: "AS18">, #<Course id: 1, title: "Betriebssysteme", user_id: 2, access_key: "e9wjzznkgml6", created_at: "2017-03-19 01:35:37", updated_at: "2017-03-19 01:39:55", semester: "SS17">, #<Course id: 2, title: "Betriebssysteme", user_id: 2, access_key: "", created_at: "2017-03-19 21:08:58", updated_at: "2017-03-19 21:08:58", semester: "WS17">, #<Course id: 4, title: "Einführung in das Programmieren", user_id: 2, access_key: "", created_at: "2017-03-19 22:14:06", updated_at: "2017-03-19 22:14:06", semester: "SS16">]>
[1m[36mQuiz Load (0.0ms)[0m [1m[34mSELECT "quizzes".* FROM "quizzes" WHERE "quizzes"."course_id" = ?[0m [["course_id", 3]]
[1m[36mQuiz Load (0.0ms)[0m [1m[34mSELECT "quizzes".* FROM "quizzes" WHERE "quizzes"."course_id" = ?[0m [["course_id", 1]]
[1m[36mQuiz Load (0.0ms)[0m [1m[34mSELECT "quizzes".* FROM "quizzes" WHERE "quizzes"."course_id" = ?[0m [["course_id", 2]]
[1m[36mQuiz Load (0.0ms)[0m [1m[34mSELECT "quizzes".* FROM "quizzes" WHERE "quizzes"."course_id" = ?[0m [["course_id", 4]]
Rendered courses/_list_desc.html.erb (7.0ms)
Rendered pages/user_home.html.erb within layouts/application (13.0ms)
Completed 200 OK in 155ms (Views: 150.8ms | ActiveRecord: 0.0ms)
我是Ruby on Rails的新手,并使用Rails 5.0.2和Devise gem 4.2.1。我花了好几个小时试图找到问题 - 有没有人知道可能出现什么问题?
答案 0 :(得分:1)
请尝试在root
阻止更改root :to => redirect('/pages/user_home')
到此
.hide(2000)
希望有所帮助!
答案 1 :(得分:0)
未定义的方法`每个&#39;为零:NilClass
courses
nil
是您收到错误的原因
<% courses.each do |course| %>
确保您在user_home
<{1}} PagesController
行动中使用适当的值初始化课程
您收到错误的请求会重定向到PagesController#user_home
Processing by PagesController#user_home as HTML
但正在工作的那个被重定向到PagesController#show
Processing by PagesController#show as HTML
问题在于
devise_scope :user do
root to: 'pages#user_home'
match '/sessions/user', to: 'devise/sessions#create', via: :post
end
设计root你可能不想改变那个