Rails не вводит пользовательские данные в postgresql - PullRequest
1 голос
/ 27 апреля 2011

У меня проблема с Rails, не вводящим значения в postgresql.Сама база данных подключена.Когда я запускаю db: create: all (фрагмент из database.yml)

development:
  adapter: postgresql
  encoding: unicode
  database: website_development
  username: postgres
  password: *******
  host: 127.0.0.1
  port: 9435

(test: то же самое, но с базой данных: website_test вместо website_development) все базы данных создаются для тестирования и разработки.Когда я запускаю мой db: миграция, также создается пользовательская таблица, например, фрагмент из файла миграции "date" _create_user.rb

class CreateUsers < ActiveRecord::Migration
  def self.up

    create_table :users do |t|
      t.string :username
      t.string :email

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

(я проверил в pgAdmin и нашел таблицы, которые были созданы) Но когда япопробуйте вставить данные из консоли, например (это было выполнено в песочнице)

irb(main):001:0> User.create!(:username => "John", :email => "john@example.com)
=> #<User id: 1, username: nil, email: nil, created_at: "2011-04-26 22:00:28", u
pdated_at: "2011-04-26 22:00:28">

вот sql, созданный при другом создании!Я запустил

[1m[35mSQL (2.0ms)[0m  INSERT INTO "users" ("username", "email", "created_at", "updated_at") VALUES (NULL, NULL, '2011-04-26 20:53:43.363908', '2011-04-26 20:53:43.363908') RETURNING "id"

Любая помощь в том, почему rails хорошо создает базы данных и таблицы, но не может найти правильное имя пользователя и адрес электронной почты для входа в sql.

PS Я запускаю Rspec для своих тестов и провел несколько тестов, касающихся значений имени пользователя и адреса электронной почты, отличных от нуля, которым все успешно.

......................
Finished in 1.62 seconds
22 examples, 0 failures
Notification failed: 201 - The destination server was not reachable
Notification failed: 201 - The destination server was not reachable

Как вы можете видеть все тесты Rspecзеленые, но у него возникли проблемы с подключением к серверу postgres

Заранее благодарим вас за любые советы.

Обновление: добавлен фрагмент пользовательской модели

class User < ActiveRecord::Base

    attr_accessor :username, :email

    email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    username_regex = /\A[\w\d]+\z/i

    validates :username, :presence   => true,
                         :format     => { :with => username_regex },
                         :length     => { :maximum => 30},
                         :uniqueness => { :case_sensitive => false }
    validates :email,    :presence   => true,
                         :format     => { :with => email_regex },
                         :uniqueness => { :case_sensitive => false }
end

== Ответ ==

Это были мои ошибки:

Часть 1. При изменении attr_accessor на attr_accessible все мои тесты работали должным образом, и все, что нужно, прошлок красному это также позволило мне добавить :email детали, но не :username детали, что приводит к части 2.

Часть 2. По какой-то причине рельсам не понравился тот факт, что моя таблица была названа :user и моя колонка была названа :username.Поэтому я попытался изменить: имя пользователя на :loginname, что полностью устранило проблему.

Спасибо всем за помощь.

1 Ответ

1 голос
/ 27 апреля 2011

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

Прямой вызов create! несколько опасен, так как вы не можете легко захватить объект, который наполовину создан в случае исключения. Это связано с тем, что, хотя исключение содержит ссылку на модель, неясно, была ли модель User или какая-либо другая модель причиной исключения в первую очередь без дополнительного копания.

Более надежный подход заключается в следующем:

def test_create_example
  user = User.new(:username => "John", :email => "john@example.com")

  assert_equal 'John', user.username
  assert_equal 'john@example.com', email

  user.save

  assert_equal [ ], user.errors.full_messages
  assert_equal false, user.new_record?
end

Если в потоке проверки возникает ошибка, вы увидите ее в списке рядом с пустым массивом. Он также проверяет, что запись была сохранена, проверяя, что она больше не является новой записью, поскольку записи могут быть действительными, но не могут быть сохранены, если фильтр before_save или before_create возвращает false, что случается случайно довольно часто .

Если вы позвоните new, а затем save, у вас будет возможность проверить вновь подготовленный объект до его сохранения, а также после.

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