我经历了各种类似的问题,例如this和this,但这并没有为我解决。
我的控制器代码。
# GET `/reservations/new`
def new
@user_id = current_user.id
if current_user.has_reserved
format.html { redirect_to reservations_url, notice: 'Only one reservation per customer is allowed' }
end
@car_id = params[:car_id]
@c = Car.where(:id => @car_id).first
puts "Hello"
puts @c.id
puts @c.update_attributes({:status => 'reserved'})
puts @c.status
@reservation = Reservation.new
end
当我访问该页面时,这是我的控制台。
Hello
4
(0.1ms) begin transaction
(0.1ms) commit transaction
true
reserved
现在我在rails console中检查数据库
Car.where(:status => 'reserved')
这给了我没有价值。 (即使Car.all
显示所有汽车的状态为“可用”,这是默认值)
以上输出:
irb(main):009:0> Car.where(:status => 'reserved')
Car Load (0.3ms) SELECT "cars".* FROM "cars" WHERE "cars"."status" = ? LIMIT ? [["status", "reserved"], ["LIMIT", 11]]
=> #<ActiveRecord::Relation []>
当我从其他问题中收集时,update_attributes
也会保存记录。它正在回归真实。那为什么它没有在数据库中反映出来?
编辑:添加模型文件代码
Car.rb
class Car < ApplicationRecord
validates_inclusion_of :status, :in => ['available','reserved','checked_out'], :default => 'available'
validates_inclusion_of :style, :in => ['coupe','sedan','suv'], :default => 'sedan'
validates_length_of :licence_plate, :is => 7, :unique => true
attr_accessor :status
end
Reservation.rb
class Reservation < ApplicationRecord
belongs_to :user
belongs_to :car
attr_accessor :can_checkout, :can_return, :can_reserve, :checked_out, :returned
end
调用reservation/new
的代码,'views / cars / index.html.erb'。
<td><%= link_to "Reserve", controller: "reservations", action: "new", car_id: car.id%></td>
答案 0 :(得分:2)
汽车在数据库中是否有状态字段?
如果是这样,为什么要使用 attr_accessor:status ?在模型中。如果该字段存在则没有必要。
删除 attr_accessor 并在数据库中添加该字段(如果不存在)。
答案 1 :(得分:1)
预订的提交表单行动&#39; new&#39;视图会调用&#39;创建&#39;保留控制器的方法,您可以将car_id作为参数传递给该方法。然后在提交方法中,您可以通过 @car = Car.find(params [:car_id])获取关联的汽车并尝试更新汽车状态