Rails 6 通过爬虫控制器创建帖子时如何关联当前登录用户
你的猜测完全正确,问题根因是新增关联后vehicles表的user_id为必填字段,爬虫创建车辆记录时没有传入该值,触发了关联验证导致保存失败。按以下步骤修改即可解决:
步骤1:修改控制器逻辑,传递当前用户ID到爬虫
更新VehiclesController的scrape方法,把current_user.id作为参数传给爬虫:
def scrape url = 'https://www.example.com/vehicles' # 新增传递当前用户ID参数 response = VehiclesSpider.process(url, current_user.id) if response[:status] == :completed && response[:error].nil? flash.now[:notice] = "Successfully scraped url" else flash.now[:alert] = response[:error] end rescue StandardError => e flash.now[:alert] = "Error: #{e}" end
步骤2:修改爬虫接收用户ID并透传
更新VehiclesSpider的process方法,接收用户ID并传递到爬虫执行上下文:
def self.process(url, user_id) @start_urls = [url] # 将用户ID存入自定义数据字段,供parse方法调用 self.crawl!(data: { user_id: user_id }) end
步骤3:创建车辆记录时关联用户
更新VehiclesSpider的parse方法,拿到用户ID后合并到创建参数中:
def parse(response, url:, data: {}) url = "https://www.example.com/new-vehicles/" # 从上下文取出当前用户ID current_user_id = data[:user_id] # ... 省略原有页面解析逻辑 pagination_vehicle_listings.each do |vehicle_listing| vehicle = { title: ..., price: ..., color: ... } # 合并用户ID后执行创建 Vehicle.where(vehicle.merge(user_id: current_user_id)).first_or_create end end
补充说明:如果业务要求同一条车辆数据可以被多个用户关联,不需要重复创建车辆记录,可以把创建逻辑调整为以下写法,避免生成冗余数据:
Vehicle.where(vehicle).first_or_create(user_id: current_user_id)
内容的提问来源于stack exchange,提问作者Mike Stamb
相关产品推荐
相关产品推荐

