#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. О, ничего себе. Это сработало. Спасибо, приятель. Я чувствую себя очень глупо сейчас, лол