2015-10-01 8 views
0

Я пытаюсь создать простой съемник данных из драгоценного камня yahoo. У меня есть вложенные установки маршрута по безопасности, которые HAS_MANY ЦенаRails Вложенные ресурсы, не создаваемые из массива

Контроллер Цены выглядит следующим образом:

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 

вложенная маршрут прекрасно работает вручную создать ребенок Цену запись из формы. Я пытаюсь создать ценовой рекорд для каждого результата в массиве, который получает генерируется из следующего кода:

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. Однако массив не создает запись цены для каждой строки массива.

Что мне недостает в этом?

Спасибо!

ответ

1

Основная причина, по которой вы ничего не получаете в своем массиве @ticker.prices, заключается в том, что вы создаете их через price = @ticker.prices.new(), но вы никогда их не спасаете. Вы должны вызвать следующее после установки всех атрибутов:

price.save 

, чтобы получить эту запись

  1. сохранен с помощью Active Record и
  2. , связанного с @ticker.

Если вы пропустите через Active Record basics guide, это поможет тонне понять жизненный цикл записи (сохранить, подтвердить, удалить и т. Д.).

Вы также, вероятно, захотите посмотреть, как ваши взгляды и маршруты больше resourceful, что по умолчанию является Rails. Если вы используете resource :prices на своих маршрутах, Rails будет использовать соглашение, чтобы помочь вам в этом.

Так, например, вы хотите иметь create метод на контроллере, который будет только ведать позвонив Datapuller.download_historical - и таким образом вы можете сделать кнопку, что ссылки на этот маршрут, просто говоря <%= link_to 'Create Price', prices_path, method: :create %>, что бы создать свой цены на клик. Есть еще несколько способов помочь Rails помочь вам написать меньше кода, но это начало. Если вы хотите больше читать, я думаю, что М. Хартл отлично справляется с объяснением RESTful resources в своем вступительном руководстве.