登录

时间:2017-04-22 09:08:37

标签: ruby-on-rails ruby redirect devise

当我登录我的测验应用程序时,我应该被重定向到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。我花了好几个小时试图找到问题 - 有没有人知道可能出现什么问题?

2 个答案:

答案 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你可能不想改变那个