【问题标题】:".save" only inserts null values in database".save" 只在数据库中插入空值
【发布时间】:2013-05-20 02:47:53
【问题描述】:

我正在尝试为一家医院制作 RoR 申请,以便它拥有患者、医生、办公室等。

我遇到的问题是,在患者“注册”时,我无法将新患者保存在数据库中。事实上,尽管我检查了属性是否正常(它只是一个名称和个人 ID),但一旦执行该方法,在数据库中只会出现一个带有“”的新行,而不是实际的属性值.方法如下:

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

【问题讨论】:

  • 您可以发布您的患者模型吗?
  • 调用.save!你会得到一个错误解释正在发生的事情。
  • @Larry 我刚刚用 Patient Model 编辑了帖子,还调用了 .save!但没有错误,我应该在哪里查看这个错误?看看患者是如何创建的Image
  • 如果您查看您的 rails 服务器的输出,您应该会确切地看到正在发生的事情。它试图保存什么值,如果发生任何错误并且保存回滚,等等。
  • 您能否确认每次您尝试保存时都会在数据库中看到一个带有空值的新条目?

标签: mysql ruby-on-rails ruby-on-rails-3.2


【解决方案1】:

删除class Patient中的以下行:

attr_accessor :name, :pID

发生的事情是attr_accessor replaced 两个数据库列属性:name:pID(它们是自动生成的)具有自己的,导致两个虚拟属性:name:pID

因此,正在设置和验证虚拟属性而不是相应的数据库属性,这导致数据库中没有错误但为空值。

【讨论】:

  • 一个可爱的答案肯定帮助了我!
【解决方案2】:

你能告诉我们这个方法是怎么调用的吗?你也确定 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

【讨论】:

  • 那么您在 Patient 控制器中的 create 方法是什么?
  • 我已根据您的建议更改了代码(使用“:pid =>id”而不是“:pID =>id”)并引发此错误“无法批量分配受保护的属性: pid”。无论如何,它不会有太大变化,因为 ":name => pName" 保持不变,对吧?
  • 而我只有一个控制器,叫做page_controller,这就是这个方法的所在。
  • 你能告诉我你是如何调用这个方法的(显示代码)和使用的表单吗?这通常会放在创建操作中的患者控制器中
  • 需要在 Patient 模型的 attr_accessible 中添加 pid。
【解决方案3】:

因此,在您的控制器中,您的参数为 nil,但您调用 .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

如果你得到有效值,这将起作用,如果没有,你会明白为什么它不是。

【讨论】:

  • 您好,感谢您的回复,但仍然无法正常工作。也许它来自数据库?这真的很令人沮丧,实际上
  • 我很好奇您是否在这里遇到路由问题。您可以发布此操作的路线吗?我注意到它不是安静的创建操作,我很好奇它是否配置为 GET 请求而不是 POST。
  • 问题已经解决了,需要从模型代码中删除 attr_accessor :name, :pID 行。无论如何,我在路线match "/pat_create" =&gt; "page#pat_create",我几乎可以肯定这不是合适的方式,但我不太了解Rest ...
猜你喜欢
  • 2013-04-17
  • 2018-11-10
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 2019-04-29
相关资源
最近更新 更多