Rails - NoMethodError (неопределенный метод `collation 'для nil: NilClass) - PullRequest
0 голосов
/ 10 февраля 2020

Когда я создаю User в своем приложении Rails, я получаю следующую ошибку ...

NoMethodError (undefined method `collation' for nil:NilClass)

Я бился головой о стену рельсами, пытаясь выяснить, в чем проблема.

Я не совсем уверен, что не так с моим кодом, так как он довольно типичен, как вы можете видеть ниже ...

user.rb

class User < ApplicationRecord
  has_secure_password

  before_create do
    self.username = 'user-' + SecureRandom.hex(8)
  end

  validates :email, presence: true, uniqueness: true, length: { within: 4..255 }
  validates :username, uniqueness: true, length: { is: 13 }
  validates :password, presence: true, uniqueness: true, length: { within: 8..255 }
end

user_controller.rb

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]

  def index
    @users = User.all
  end

  def show; end

  def new
    @user = User.new
  end

  def edit; end

  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
      else
        format.html { render :new }
      end
    end
  end

  def update
    respond_to do |format|
      if @user.update(user_params)
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
      else
        format.html { render :edit }
      end
    end
  end

  def destroy
    @user.destroy
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
    end
  end

  private

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

  def user_params
    params.fetch(:user).permit(:username, :email, :password, :password_confirmation)
  end
end

_form. html .erb

<%= form_for(@user, local: true) do |form| %>
  <div class="field">
    <%= form.label :email %>
    <%= form.text_field :email %>
  </div>

  <div class="field">
    <%= form.label :password %>
    <%= form.password_field :password %>
  </div>

  <div class="field">
    <%= form.label :password_confirmation, 'Password Confirmation' %>
    <%= form.password_field :password_confirmation %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

Я изменил Кодирование в базе данных также, кажется, ничего не работает.

ОБНОВЛЕНИЕ Я не совсем уверен, что было не так, я вернулся к своей "первоначальной фиксации" проекта и восстановил все и он работает нормально, он использует тот же код. Я отмечу это как решенное, но у меня нет правильного решения, кроме восстановления.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2020

Я не совсем уверен, что было не так, я вернулся к своей «первоначальной фиксации» проекта и восстановил все, и он работает нормально, он использует тот же код. Я отмечу это как решенное, но у меня нет правильного решения, кроме регенерации.

0 голосов
/ 30 марта 2020
validates :password, presence: true, uniqueness: true, length: { within: 8..255 }

Здесь удалите uniqueness: true

Вы не хотите, чтобы пароль был уникальным, и, насколько я знаю, если вы используете has_secure_password, bcrypt gem будет сохранить дайджест пароля пользователя в вашей базе данных, что делает практически невозможным проверку идентичности паролей двух пользователей.

0 голосов
/ 10 февраля 2020

Он говорит вам, в чем ошибка. Вы звоните .collation на что-то - я бы предположил на @user. Журнал скажет вам, какая строка вызывает ошибку. Что эта линия выглядит как линия?

Например, если ошибка содержит строку, подобную этой:

app/views/layouts/application.html.erb:16

Тогда будет вызвано что-то вроде @user.collation. Но, учитывая, что вторая часть ошибки говорит о nil:NilClass, это означает, что @user не установлено.

Обновление

Таким образом, эта строка указывает на вашу create метод с ошибкой. Это должно быть User.create(user_params), а не User.new(user_params). Хотя после этого вы звоните .save, поэтому он должен работать.

Также, возможно, сделайте обратный вызов after_create и измените его на следующее:

after_create do
  update(:username, "user-#{SecureRandom.hex(8)}"
end

Никаких недостатков, и это может раскрыть то, что происходит. before_create Я считаю себя настоящим предателем.

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