Не удается обойти ошибку проверки «Вам нужно указать хотя бы один атрибут» в ActiveRecord? - PullRequest
1 голос
/ 30 сентября 2011

Я следовал учебному пособию Михаэля Хартла, но воспользовался ярлыком, чтобы попытаться «улучшить» его пример и создать серьезную ошибку ...

По сути, это приложение вращается вокруг пользователямодель в сочетании с функцией регистрации, использующей множество проверок вокруг функции зашифрованного пароля;Это не просто для новичка в рельсах.

Вместо того, чтобы строго следовать примеру Хартла, я изменил подход, чтобы использовать эшафот для настройки моих пользователей.Но где-то ближе к концу его проекта я начал получать эту ошибку при попытке создать пользователя:

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

Мне удалось убрать сообщение об ошибке, закомментировав все проверки в моей модели, но я буду добавлять их обратно один за другим;так что мне все еще нужно решить эту ошибку ....

Ответы [ 2 ]

4 голосов
/ 30 сентября 2011

Эта строка в вашей User модели:

validates :allow_nil => true, :presence => true, :on => :save

не предоставила атрибут для проверки.Возможно, вы хотели включить эти параметры в каждую проверку, указанную ниже, но это не так, как работает validates.

0 голосов
/ 30 сентября 2011

Я согласен с jimworm.Валидация не запускается по новой.Он запускается только до того, как вы попытаетесь сохранить или назвать действительным?Вам нужно просто удалить контуры линии jimworm.

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