Ошибка ActionView :: Template :: Error (неопределенный метод `name 'для nil: NilClass) - PullRequest
0 голосов
/ 27 августа 2018

Я использую ruby ​​2.4 и rails 5.1.6.

Чтобы изучить RoR, я вручную создал модель, представление и контроллер пользователя, а не использовал каркас.

После заполнения формы для создания нового пользователя я получаю эту ошибку в журнале сервера rails:

Started POST "/users" for 127.0.0.1 at 2018-08-27 15:52:45 +0530
Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"gdSumxEvNi6ECKBZLFKN9dB/PYLOmixMcf5oYcUGkE1u4iAa/YkJlu7SJbPQNlh6J2SEzR2WeSUT9frhteEOCw==", "user"=>{"name"=>"User1", "email"=>"user1@yahoo.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign Up"}
   (0.2ms)  begin transaction
  User Exists (0.6ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) LIMIT ?  [["email", "user1@yahoo.com"], ["LIMIT", 1]]
  SQL (0.8ms)  INSERT INTO "users" ("name", "email", "password_digest", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?)  [["name", "User1"], ["email", "user1@yahoo.com"], ["password_digest", "$2a$10$Efhs2Z2BRa5FCUdSIz6D5.c/eiFQm3JaW818veE644NdoWluRLjoq"], ["created_at", "2018-08-27 10:22:45.636574"], ["updated_at", "2018-08-27 10:22:45.636574"]]
   (1.0ms)  commit transaction
Redirected to http://127.0.0.1:3000/users/1
Completed 302 Found in 93ms (ActiveRecord: 2.6ms)


Started GET "/users/1" for 127.0.0.1 at 2018-08-27 15:52:45 +0530
Processing by UsersController#show as HTML
  Parameters: {"id"=>"1"}
  Rendering users/show.html.erb within layouts/application
  Rendered users/show.html.erb within layouts/application (9.8ms)
Completed 500 Internal Server Error in 32ms (ActiveRecord: 0.0ms)



ActionView::Template::Error (undefined method `name' for nil:NilClass):
    1: 
    2: <h1><%= @user.name %></h1>
    3: <h2><%= @user.email %></h2>

app/views/users/show.html.erb:2:in `_app_views_users_show_html_erb___1408287096995644504_70277415453360'

Как видите, запись успешно сохраняется в БД, но каким-то образом переменная @user уничтожается к тому времени, когда она попадает в шаблон show.html.erb.

Вот это users_controller.rb

class UsersController < ApplicationController
  def index
  end

  def show
    byebug
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to @user
      byebug
    else
      render 'new'
    end
  end

  def edit
  end

  def update
  end

  def destroy
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end

... и вот содержимое show.html.erb

<h1><%= @user.name %></h1>
<h2><%= @user.email %></h2>

Вывод @ user.name в точке останова byebug в действии user # create показывает правильное значение, но во второй точке останова byebug в действии user # show я получаю эту ошибку:

(byebug) @user.name
*** NoMethodError Exception: undefined method `name' for nil:NilClass

Просто чтобы убедиться, что я сделал второе приложение, но использовал генератор скаффолдов, и все работало нормально.

Есть идеи?

приписка

Я написал несколько проверок в пользовательской модели (app / models / user.rb). Я включил это ниже на всякий случай ...

class User < ApplicationRecord
    validates :name, presence: true
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    before_save {email.downcase!}
    validates :email, presence: true, 
                        format: {with: VALID_EMAIL_REGEX},
                        uniqueness: {case_sensitive: false}

    validates :password, presence: true, length: {minimum: 6}

    has_secure_password
end

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Я думаю, вы не определили @user объект. Вы можете сделать это, добавив @user = User.find_by(id: params[:id]) в ваше show действие

0 голосов
/ 27 августа 2018

Если вы можете проверить свой журнал, ниже приводится заявление:

Started GET "/users/1" for 127.0.0.1 at 2018-08-27 15:52:45 +0530
Processing by UsersController#show as HTML
  Parameters: {"id"=>"1"}

Хэш {"id" => "1"} указывает на то, что вы пытаетесь получить пользователя с id = 1. Теперь вам просто нужно переопределить метод show, как показано ниже:

  def show
    @user = User.find_by_id(params[:id])
  end
0 голосов
/ 27 августа 2018

Вы должны определить метод установки в приватной области контроллера пользователя

private
def set_user
  @user = User.find(params[:id])
end

и добавить это в контроллер:

before_action :set_user, only: [:show]

Вы также можете определить (в before_action) другоеметоды, которым нужен доступ к объекту пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...