在个人项目中使用Rails 5。我有一个带有以下AR的用户模型 user schema
但是在尝试在我的一个控制器中添加一个返回和离开属性之后,我得到了一个回滚事务,它不会让我将数据保存到对象中。这是控制器的样子:
def find_flights
@user = User.find(session[:user_id])
@user.budget= params["user"]["budget"].to_f
@user.departure = params["user"]["departure"]
@user.return = params["user"]["return"]
@user.save
...
此时的参数如下:
[1] pry(#<QuotesController>)> params
=> <ActionController::Parameters {"utf8"=>"✓", "user"=><ActionController::Parameters {"budget"=>"1200", "city"=>"Boston", "departure"=>"09/21/2016", "return"=>"10/08/2016"} permitted: false>, "commit"=>"Find Flights", "controller"=>"quotes", "action"=>"find_flights"} permitted: false>
即使在Rails控制台中,我也无法手动创建对象。注意:我不需要在实例化时离开/返回。
这是我的AR错误:
User Exists (0.2ms) SELECT 1 AS one FROM "users" WHERE "users"."name" = ? AND ("users"."id" != ?) LIMIT ? [["name", "Mark"], ["id", 1], ["LIMIT", 1]]
(0.1ms)回滚事务
这是用户模型
class User < ApplicationRecord
has_secure_password
has_many :itineraries
has_many :quotes, through: :itineraries
validates :name, presence: { message: "must exist" }, uniqueness: { message: "already exists"}
validates :password, length: { minimum: 4 }
validate :name_is_alpha_num?
def name_is_alpha_num?
if !self.name.match(/^[[:alnum:]]+$/)
errors.add(:name, "may only be alphanumeric characters")
end
end
def dates_valid?
dates_not_nil && return_after_departure && dates_in_future
end
def return_after_departure
self.return > self.departure
end
def dates_in_future
(self.return.to_s > Time.now.strftime("%d/%m/%Y")) && (self.departure.to_s > Time.now.strftime("%d/%m/%Y"))
end
def dates_not_nil
(self.return != nil) && (self.departure != nil)
end
def budget_valid?
budget_not_zero && budget_positive && budget_a_number ? true : false
end
def budget_not_zero
self.budget != 0 && self.budget != nil
end
def budget_positive
self.budget > 0
end
def budget_a_number
self.budget.is_a?(Integer) || self.budget.is_a?(Float)
end
end
答案 0 :(得分:0)
我看不出你的模型有什么问题,但现在我看到错误信息,它告诉你“用户存在”。
您正在尝试创建新用户,但该用户已存在。
您似乎在会话中存储了用户的ID,因此:
@user = User.find(session[:user_id])
我认为你想要更新这个用户,而不是保存这个用户。
阅读官方指南中的this。
您正在调用“保存”,这将激活您的验证。您有一个验证,坚持该名称是唯一的。由于该用户已存在,因此无法使用“保存”。你需要做一个更新。