Rails嵌套资源不是从Array创建的

时间:2015-10-01 01:08:26

标签: ruby-on-rails arrays ruby nested-routes

我正在尝试从雅虎财经宝石创建一个简单的数据提取器。我有一个针对安全的嵌套路由设置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记录。

我在这里错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

您未在@ticker.prices数组中保存任何内容的主要原因是您通过price = @ticker.prices.new()实例化了这些内容,但您永远不会保存它们。设置所有属性后,需要调用以下命令:

price.save

获取该记录

  1. 通过Active Record和
  2. 保存
  3. 与您的@ticker相关联。
  4. 如果你浏览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