Ошибка с сохранением!метод в Rails 3.1.0-rc6 - PullRequest
0 голосов
/ 23 августа 2011

Не знаю, что я делаю не так ... Иметь этот код:

new_model = Model.new(:brand_id=>brand_id, :name=>new_model_name)
new_model.save!
ModelImage.upload(new_model.id, params[:images])

но new_model.id равно нулю. WTF?

Попробовал в рельсах c, ошибок нет. SQl в порядке.

Thx.

Некоторый код из Rails Console:

irb(main):045:0> h = Model.create(:brand_id=>2, :name=>'SKyFy')
SQL (0.1ms)  BEGIN
SQL (42.2ms)  INSERT INTO `models` (`brand_id`, `id`, `name`) VALUES (?, ?, ?)     [["brand_id", 2], ["id", nil], ["name", "SKyFy"]]
(118.7ms)  COMMIT
=> #<Model id: nil, brand_id: 2, name: "SKyFy">
irb(main):046:0> h.id
=> nil

Нет attr_ *, проверки. Модели понятны.

Другой пример:

irb(main):048:0> h = Model.new(:brand_id=>1, :name=>'SKYDOS')
=> #<Model id: nil, brand_id: 1, name: "SKYDOS">
irb(main):049:0> h.save!
SQL (0.2ms)  BEGIN
SQL (3.4ms)  INSERT INTO `models` (`brand_id`, `id`, `name`) VALUES (?, ?, ?)  [["brand_id", 1], ["id", nil], ["name", "SKYDOS"]]
(83.5ms)  COMMIT
=> true
irb(main):050:0> h.id
=> nil
irb(main):051:0> h.errors
=> #<ActiveModel::Errors:0x9a37c18 @base=#<Model id: nil, brand_id: 1, name: "SKYDOS">,     @messages={}>
irb(main):052:0> 

PS Решил мою проблему ... имел ДВА первичных ключа. Спасибо всем.

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

Установите

config.active_record.schema_format = :sql

в config / application.rb

. Это должно помочь решить ваши проблемы.

Обратите внимание на запрос,

INSERT INTO `models` (`brand_id`, `id`, `name`) VALUES (?, ?, ?)  [["brand_id", 1], ["id", nil], ["name", "SKYDOS"]

Этот запрос неверен, Rails не знает о первичном ключе таблицы и предполагает (неверно), что id - это просто обычный столбец.С форматом схемы SQL - это должно работать нормально.

Вы можете подтвердить это, взглянув на db / schema.rb, и у вас получится что-то вроде:

create_table "foos", :id => false, :force => true do |t|
  t.integer  "id",                                 :null => false
  ...
end
2 голосов
/ 23 августа 2011

Трудно сказать с таким небольшим количеством информации, но ответ, скорее всего, лежит в ваших утверждениях для new_model.

Посмотрите на new_model.rb и посмотрите, есть ли какие-либо проверки, которые могут быть неудачными.

Если нет, посмотрите, есть ли у вас конфликт attr_accessible / attr_protected.

Чтобы помочь вам быстро найти ответ, добавьте строку:

logger.debug new_model.errors

после вашего save!, и вы увидите, что происходит в ваших журналах.

1 голос
/ 23 августа 2011

Убедитесь, что у вас есть первичный ключ 'id' с auto_increment в таблице модели.

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