我正在尝试为医院制作RoR应用程序,因此它有患者,医生,办公室等。
我遇到的问题是,在患者"注册",我无法将新患者保存在数据库中。实际上,尽管我已经检查过属性是否正常(它只是一个名称和个人ID),但一旦方法被删除,在数据库中只出现一个带有"&lt的新行。 ;空>"而不是实际的属性值。这是方法:
def pat_create
pName = params[:name].to_s
id = params[:pid].to_s.to_i
pat = Patient.where(:pID => id).first
if pat == nil
pat = Patient.new(:name => pName, :pID =>id)
pat.save
end
end
此外,这是它构造的查询:
INSERT INTO `patients` (`created_at`, `name`, `pID`, `updated_at`) VALUES ('2013-05-20 02:04:28', NULL, NULL, '2013-05-20 02:04:28')
在其他视图收集以下形式的:name和:pid信息之后调用此方法:
<%= form_tag('/page/pat_create') do %>
<%= text_field_tag :name, nil%>
<%= text_field_tag :pid, nil%>
<%= button_tag(type: "submit", class: "btn btn-success") do %>
Register<i class="icon-white icon-plus"></i>
<%end%>
<%end%>
毋庸置疑,pat.errors.empty?
是真的,pat.save
也是如此。
知道为什么会这样吗?
此处的患者模型:
class Patient < ActiveRecord::Base
attr_accessible :name, :pID
attr_accessor :name, :pID
has_many :appointments
validates_presence_of :name
validates :name, :format => {:with=> /^[a-zA-Z\s\D]+$/}
validates_presence_of :pID
validates_numericality_of :pID
validates_inclusion_of :pID, :in => 100000..9999999999
end
答案 0 :(得分:4)
删除class Patient
中的以下行:
attr_accessor :name, :pID
发生了什么attr_accessor replaced两个数据库列属性:name
和:pID
(它们是自动生成的)有自己的,导致两个虚拟属性:name
和:pID
。
因此,正在设置和验证虚拟属性而不是相应的数据库属性,这导致数据库中没有错误但是空值。
答案 1 :(得分:-1)
您能告诉我们如何调用此方法吗?你还确定params [:name]和params [:pid]。
您使用过列:pid和:pID,如下所示
pat = Patient.where(:pID => id).first
if pat == nil
pat = Patient.new(:name => pName, :pID =>id) # should use pat = Patient.new(:name => pName, :pid =>id)
pat.save
end
答案 2 :(得分:-1)
所以在你的控制器中你的参数是零,但是你调用.to_s
和.to_s.to_i
会导致空字符串“”和0(零)。然后,将它们保存到数据库中。一对建议:
def pat_create
pat = Patient.new(:name => params[:name], :pid =>params[:pid])
pat.save
end
除了唯一性验证之外,我还要确保您的db列上有唯一的索引,以确保没有重复的患者。
class Patient < ActiveRecord::Base
attr_accessible :name, :pid
attr_accessor :name, :pid
has_many :appointments
validates :name, presence: true,
length: { maximum: 50 },
format: {:with=> /^[a-zA-Z\s\D]+$/}
validates :pid, presence: true,
numericality: { only_integer: true,
greater_than_or_equal_to: 100000,
less_than_or_equal_to: 9999999999 },
uniqueness: true
end
如果您获得有效值,这将有效,如果没有,您将看到它为什么不是。