不知道我做错了什么...... 有这个代码:
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等于nil。 WTF?
在rails c中尝试过,没有错误。 SQl没问题。
THX。
Rails控制台中的一些代码:
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 解决了我的问题 ...有两个主键。 感谢所有人。
答案 0 :(得分:2)
很难用如此少的信息说出来,但答案很可能在于你对new_model
的验证。
查看new_model.rb
,看看是否有任何可能失败的验证。
如果没有,请查看您是否发生attr_accessible
/ attr_protected
冲突。
为了帮助您快速找到答案,请添加以下行:
logger.debug new_model.errors
在save!
之后,您会看到日志中发生了什么。
答案 1 :(得分:2)
集
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 :(得分:1)
确保您在模型表中使用 auto_increment 来获得主键'id'。