Я следовал учебному пособию Михаэля Хартла, но воспользовался ярлыком, чтобы попытаться «улучшить» его пример и создать серьезную ошибку ...
По сути, это приложение вращается вокруг пользователямодель в сочетании с функцией регистрации, использующей множество проверок вокруг функции зашифрованного пароля;Это не просто для новичка в рельсах.
Вместо того, чтобы строго следовать примеру Хартла, я изменил подход, чтобы использовать эшафот для настройки моих пользователей.Но где-то ближе к концу его проекта я начал получать эту ошибку при попытке создать пользователя:
ArgumentError in UsersController#new
You need to supply at least one attribute.
Это сбивает с толку меня, так как я пытался отключить всю проверку, кроме сохранения.Ниже приведены некоторые фрагменты кода:
my users_controller.rb # new:
class UsersController < ApplicationController
# GET /users
# GET /users.xml
def index
@users = User.all
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end
end
.....
def new
@title = "Sign up"
@user = User.new
#(unnecessary?)
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @user }
end
end
от моего user.rb:
class User < ActiveRecord::Base
attr_accessor :password
attr_accessor :username, :firstname, :lastname, :email, :password, :password_confirmation
email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
# here I am attempting to only validate when saving
validates :allow_nil => true, :presence => true, :on => :save
validates :firstname, :presence => true,
:length => { :maximum => 50 }
validates :lastname, :presence => true,
:length => { :maximum => 50 }
validates :username, :presence => true,
:length => { :maximum => 20 }
validates :email, :presence => false,
:format => { :with => email_regex },
:uniqueness => { :case_sensitive => false }
# Automatically create the virtual attribute 'password_confirmation'.
validates :password, :presence => true,
:confirmation => true,
:length => { :within => 6..40 }
before_save :encrypt_password
# Return true if the user's password matches the submitted password.
def has_password?(submitted_password)
encrypted_password == encrypt(submitted_password)
end
def self.authenticate(email, submitted_password)
user = find_by_email(email)
return nil if user.nil?
return user if user.has_password?(submitted_password)
end
def self.authenticate_with_salt(id, cookie_salt)
user = find_by_id(id)
(user && user.salt == cookie_salt) ? user : nil
end
def initialize(attributes = {})
@username = attributes[:username]
@firstname = attributes[:firstname]
@lastname = attributes[:lastname]
@email = attributes[:email]
end
def formatted_email
"#{@firstname} #{@lastname}<#{@email}>"
end
private
def encrypt_password
self.salt = make_salt unless has_password?(password)
self.encrypted_password = encrypt(password)
end
def encrypt(string)
secure_hash("#{salt}--#{string}")
end
def make_salt
secure_hash("#{Time.now.utc}--#{password}")
end
def secure_hash(string)
Digest::SHA2.hexdigest(string)
end
end
Любые предложения приветствуются!
- Рик
PS - по запросу.вот метод создания:
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
format.html { redirect_to(@user, :notice => 'User was successfully created.') }
format.xml { render :xml => @user, :status => :created, :location => @user }
else
format.html { render :action => "new" }
format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
end
end
end
Мне удалось убрать сообщение об ошибке, закомментировав все проверки в моей модели, но я буду добавлять их обратно один за другим;так что мне все еще нужно решить эту ошибку ....