【问题标题】:Save data from api (but just once)从 api 保存数据(但只有一次)
【发布时间】:2016-07-01 13:41:12
【问题描述】:

我想保存 API 中的数据,但只保存一次。目前,每次我重新加载页面时它都会保存数据,所以我有很多次相同的条目......我只想保存新的条目。 当我尝试添加验证以避免这种情况时,我收到此错误:

验证失败:日期已被占用,Url 已被占用

这是我的代码:

架构:

 create_table "conferences", force: :cascade do |t|
  t.string   "title",      null: false
  t.string   "url"
  t.date     "date",       null: false
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

conference.rb:

class Conference < ActiveRecord::Base
validates_presence_of :title, :date
validates :date, :url, :uniqueness => true

 def self.save_conference_from_api
  response = ApiMeetup.new.events('parisrb')
  api_data = JSON.parse(response.body)
  parisrb = []
  api_data.each do |event|
    if event["name"] == "ParisRb.new(premier: :mardi, pour: :talks)"
      parisrb << event
    end
  end
  parisrb.map do |line|
    conference = Conference.new
    conference.title = line['name']
    conference.date = line['time']
    conference.url = line['link']
    conference.save!
  end
  Conference.all
 end
end

会议控制器:

def index
  @conferences = Conference.save_conference_from_api
end

索引:

%ul
  - @conferences.each do |conf|
    %li
      %span
        = conf.date

【问题讨论】:

  • 您的验证工作正常,那么到底是什么问题?他们正在阻止创建记录并告诉您。
  • 是的,验证有效,但那时我无法访问该站点。那么我怎么能说“好吧它存在所以什么都不做,去检查下一个,然后显示页面”

标签: ruby-on-rails database api validation rails-activerecord


【解决方案1】:

如果无效就不要保存

conference.save!

变成

if conference.valid? conference.save!

因为保存!引发 ActiveRecordValidation 错误,然后您可以捕获它,而您实际上并不需要 !如果您在保存前检查有效记录,则在保存方法上

所以你可以拥有

begin
  conference.save!
rescue ActiveRecord::RecordInvalid => invalid
  # Do nothing
end

或者你真的应该有

if conference.valid? conference.save

如果所有记录都在一个数组中,那么您的 html 模板可以遍历该数组并根据需要显示每个记录的错误。

【讨论】:

  • @Orsay 欢迎您。您没有得到很快的答复,因为您的问题非常不清楚。如果您在将来发布问题之前花更多时间思考问题,您将获得更好/更快的响应。很高兴能帮上忙
  • 是的,我一直在尝试发布更清晰的问题 :) 感谢您的帮助和建议!
猜你喜欢
  • 1970-01-01
  • 2018-06-01
  • 2014-04-12
  • 1970-01-01
  • 2012-09-22
  • 2015-05-22
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
相关资源
最近更新 更多