неопределенная локальная переменная или метод «пароль» для Пользователя

#ruby-on-rails #ruby

Вопрос:

Я следую этому учебнику и застрял на части проверки.

Я следовал пошаговому руководству, но когда я пытаюсь создать виртуальный атрибут, который получит пароль, я получаю следующую ошибку: undefined local variable or method 'password' for User .

Вот мой:

user.rb

 class User < ApplicationRecord
    has_secure_password
    validates name, presence: true, length: {maximum: 50}
    validates password, presence: true, length: {minimum: 6}
    VALID_EMAIL_FORMAT= /A([^@s] )@((?:[-a-z0-9] .) [a-z]{2,})Z/i
    validates email, presence: true, length: {maximum: 260}, format: { with: VALID_EMAIL_FORMAT}, uniqueness: {case_sensitive: false}
    before_save { self.email = email.downcase, :set_default }

    def set_default
        self.comissaoAcumuladaAtual = 0 unless self.comissaoAcumuladaAtual
        self.comissaoASerRetirada = 0 unless self.comissaoASerRetirada
    end
end
 

users_controller.rb

 class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect to @user, notice: "Cadastro realizado com sucesso."
      #sign_in(@user)
    else
      render action: :new
    end
  end

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

new.html.erb

 <%= form_for @user do |f| %>
            <% if @user.errors.any? %>
            <div id="error_explanation">
                        <div class="alert-error">
                                   O formulário contém <%= pluralize(@user.errors.count, "erro") %>.
                        </div>
                        <ul>
                                   <% @user.errors.full_messages.each do |msg| %>
                                   <li><%= msg %></li>
                                   <% end %>
                        </ul>
            </div>
<% end %>
            <div class="field">
                <%= f.label :name %>
                <%= f.text_field :name %>
            </div>
            <div class="field">
                <%= f.label :email %>
                <%= f.email_field :email %>
            </div>
            <div class="field">
                <%= f.label :password %>
                <%= f.password_field :password %>
            </div>
            <div class="field">
                <%= f.label :password_confirmation %>
                <%= f.password_field :password_confirmation %>
            </div>
            <div class="field">
                <%= f.label :tipoPlano%>
                <%= f.text_field :tipoPlano%>
            </div>
            <div class="field">
                <%= f.label :valorPlano%>
                <%= f.number_field  :valorPlano, step: 0.01%>
            </div>
            <div class="actions">
                        <%= f.submit "Cadastrar"%>
            </div>
<% end %>
 

routes.rb

 Rails.application.routes.draw do
  resources :users
  get    'sign_in'   => 'sessions#new'
  post   'sign_in'   => 'sessions#create'
  delete 'sign_out'  => 'sessions#destroy'
end

 

Я серьезно понятия не имею, что делать. Я думал об этом по крайней мере 1 час и, похоже, не могу заставить это работать. Нужно ли мне определять виртуальный атрибут в другом месте?

Ответ №1:

Метод validates ожидает, что первым аргументом будет a Symbol .

Просто переоденься

 validates name, presence: true, length: {maximum: 50}
validates password, presence: true, length: {minimum: 6}
validates email, presence: true, length: {maximum: 260}, format: { with: VALID_EMAIL_FORMAT}, uniqueness: {case_sensitive: false}
 

Для

 validates :name, presence: true, length: {maximum: 50}
validates :password, presence: true, length: {minimum: 6}
validates :email, presence: true, length: {maximum: 260}, format: { with: VALID_EMAIL_FORMAT}, uniqueness: {case_sensitive: false}
 

Комментарии:

1. О, ничего себе. Это сработало. Спасибо, приятель. Я чувствую себя очень глупо сейчас, лол