我正在尝试从雅虎财经宝石创建一个简单的数据提取器。我有一个针对安全的嵌套路由设置has_many Price
Price控制器如下:
class PricesController < ApplicationController
before_action :set_security
before_action :set_price, only: [:show, :edit, :update, :destroy]
def new
@price = Price.new
end
private
def set_price
@price = Price.find_by_name(params[:id])
end
def price_params
params.require(:price).permit(:date, :open, :high, :low, :close, :volume, :security_id)
end
def set_security
@security = Security.find_by_ticker(params[:security_id])
end
end
嵌套路由可以很好地从表单手动创建子Price记录。我试图为从以下代码生成的数组中的每个结果创建Price记录:
class Datapuller
def self.download_historical
yahoo_client = YahooFinance::Client.new
data = yahoo_client.historical_quotes("FB")
data.each do |i|
@ticker = Security.find_by_ticker(data[0].symbol )
price = @ticker.prices.new()
price.security_id = @ticker
price.date = data[0].date
price.open = data[0].open
price.high = data[0].high
price.low = data[0].low
price.close = data[0].close
end
end
end
我想通过按钮链接调用此方法,但是现在我在安全视图上有以下代码:
<%= Datapuller.download_historical %>
这也让我看到了从数组中加载的数据。
使用上面的代码,我可以使用表单为父级安全创建子价格,我可以从yahoo finance gem进行调用。但是,该数组不会为数组中的每一行创建Price记录。
我在这里错过了什么?
谢谢!
答案 0 :(得分:1)
您未在@ticker.prices
数组中保存任何内容的主要原因是您通过price = @ticker.prices.new()
实例化了这些内容,但您永远不会保存它们。设置所有属性后,需要调用以下命令:
price.save
获取该记录
@ticker
相关联。 如果你浏览Active Record basics guide,它将有助于理解记录的生命周期(保存,验证,删除等)。
您也可能希望查看更多resourceful的视图和路由,这是Rails的默认设置。如果在路由中使用resource :prices
,Rails将使用它的约定来帮助您。
例如,你的控制器上有一个create
方法,它只负责调用你的Datapuller.download_historical
- 这样你就可以制作一个链接到那条路线的按钮通过说<%= link_to 'Create Price', prices_path, method: :create %>
来创建点击价格。还有更多方法可以让Rails帮助您编写更少的代码,但这是一个开始。如果你想要更多的阅读,我想M. Hartl在他的介绍指南中做了很好的解释RESTful resources。