Ruby / Rails 1 & 2: problemas de recolha
-
03-07-2019 - |
Pergunta
Ei, eu só comecei a aprender Ruby / Rails. No momento, eu tento fazer um exemplo de um livro alemão "Praxiswissen Ruby on Rails", que é bastante antiga e escrito para Ruby on Rails 1. De qualquer forma, eu tentei fazer os exemplos com Rails 2. Problema Agora eu tive há mais de uma semana.
De acordo com o livro (Rails 1) Eu tenho que escrever no meu controlador:
page.replace_html ( 'Broadcast_search_result', : Partial => 'broadcast_search_result', : collection => @videos [ 'item'] );
Eu descobri que isso no Rails 2 está escrito semelhante ao:
@items = try (@videos [: Artigos])
page.replace_html ( 'broadcast_search_results', : Parcial => @items )
Mas o servidor lança seguinte mensagem:
ActionView :: MissingTemplate (Faltando hashes modelo / _hash.erb em app vista caminho / views):
app / controllers / stations_controller.rb: 46: em `__instance_exec0'
app / controllers / stations_controller.rb: 30: em `search_broadcasts'
Eu deveria criar um hashes modelo / _hash.erb em vez de estações / _item.erb. Alguém pode me ajudar, por favor?
Muito obrigado!
OK, eu vou adicionar o código do controlador: stations_controller.rb:
class StationsController < ApplicationController
# GET /stations
# GET /stations.xml
def index
@stations = Station.all
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @stations }
end
end
#GET /stations/search_broadcasts
def search_broadcasts
@search = params[:broadcast_search][:search]
@channel = params[:broadcast_search][:channel]
if params[:broadcast_search][:current_page]
@current_page = params[:broadcast_search][:current_page].to_i
else
@current_page = 1
end
@videos = Broadcast.get_videos(
@search,
@channel,
2,
@current_page
)
render(:update) { |page|
if @videos[:http_code] == 200
page.replace_html(
'broadcast_search_results_count',
:inline => "<p>Es wurden <b><%= @videos[:count] %></b> Sendung<%= 'en' unless @videos[:count] == 1 %> gefunden</p>"
)
else
page.replace_html(
'broadcast_search_results_count',
:inline => "<p>Es trat ein Fehler bei der Datenübertragung auf.</p>"
)
end
if @videos[:count] > 0
logger.debug "The object is #{@videos[:items]}"
@items = @videos[:items]
page.replace_html(
'broadcast_search_results',
:partial => @items
)
page.replace_html(
'broadcast_search_results_navigation',
:partial => 'broadcast_search_results_navigation',
:locals => {
:videos => @videos,
:search => @search,
:channel => @channel,
:current_page => @current_page
}
)
page.show('broadcast_search_results')
page.show('broadcast_search_results_navigation')
#page.visual_effect(
# :highlight,
# 'bradcast_search_results'
#)
else
#page.hide('broadcast_search_results')
#page.hide('broadcast_search_results_navigation')
end
}
end
# GET /stations/1
# GET /stations/1.xml
def show
@station = Station.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @station }
end
end
# GET /stations/new
# GET /stations/new.xml
def new
@station = Station.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @station }
end
end
# GET /stations/1/edit
def edit
@station = Station.find(params[:id])
end
# POST /stations
# POST /stations.xml
def create
@station = Station.new(params[:station])
respond_to do |format|
if @station.save
flash[:notice] = 'Station was successfully created.'
format.html { redirect_to(@station) }
format.xml { render :xml => @station, :status => :created, :location => @station }
else
format.html { render :action => "new" }
format.xml { render :xml => @station.errors, :status => :unprocessable_entity }
end
end
end
# PUT /stations/1
# PUT /stations/1.xml
def update
@station = Station.find(params[:id])
respond_to do |format|
if @station.update_attributes(params[:station])
flash[:notice] = 'Station was successfully updated.'
format.html { redirect_to(@station) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @station.errors, :status => :unprocessable_entity }
end
end
end
# DELETE /stations/1
# DELETE /stations/1.xml
def destroy
@station = Station.find(params[:id])
@station.destroy
respond_to do |format|
format.html { redirect_to(stations_url) }
format.xml { head :ok }
end
end
end
O modelo broadcast.rb (para Broadcast.get_videos):
require('net/http')
require('uri')
require('xmlsimple')
class Broadcast < ActiveRecord::Base
belongs_to :station
AOL_API_URL = 'http://xml.truveo.com/apiv3'
AOL_DEVELOPER_ID = '12345667myid'
def self.channels
return[
'[Alle Quellen]',
'YouTube',
'MYSPACE',
'Dailymotion',
'Google Video',
'IFILM',
'Veoh'
]
end
def self.get_videos(search, channel, per_page, page)
channels = '' if channel == '[Alle Quellen]'
url = AOL_API_URL +
"?method=truveo.videos.getVideos" +
"&query=" + URI.escape("#{search} type:free format:flash channel:\"#{channel}\"") +
"&results=#{per_page.to_i}" +
"&start=#{(page.to_i) * per_page.to_i}" +
"&appid=#{AOL_DEVELOPER_ID}"
data = Broadcast.get_xml(url)
if data[:http_code] == 200
data[:page_count] = data[:count] / per_page
data[:page_count] += 1 if data[:count] % per_page > 0
end
return data
end
def self.get_video(video_id)
url = AOL_API_URL +
"?method=truveo.videos.getVideos" +
"&query=" + URI.escape('id:' + video_id.to_s) +
"&appid=#{AOL_DEVELOPER_ID}"
data = Broadcast.get_xml(url)
video = data[:items][0]
video[:http_code] = data[:http_code]
return video
end
def self.get_xml(url)
# Data-Objekt initialisieren
data = Hash.new
data[:count] = 0
data[:items] = Array.new
data[:url] = url
# XML-Daten holen
xml = Net::HTTP.get_response(URI.parse(url))
# HTTP-Response-Code ŸberprŸfen
data[:http_code] = xml.code.to_i
return data unless data[:http_code] == 200
# XML Parsen
xml_obj = XmlSimple.xml_in(xml.body.to_s)
data[:count] = xml_obj['VideoSet'][0]['totalResultsAvailable'][0].to_i
return data if data[:count] == 0
# Informationen auslesen
xml_obj['VideoSet'][0]['Video'].each { |xml_video|
new_video = Hash.new
new_video[:video_id] = xml_video['id'][0].to_s
new_video[:title] = xml_video['title'][0].to_s
new_video[:source_url] = xml_video['videoUrl'][0].to_s
new_video[:thumbnail_url] = xml_video['thumbnailUrl'][0].to_s
new_video[:description] = (xml_video['description'][0].to_s) if xml_video['description']
new_video[:video_html] = (xml_video['videoPlayerEmbedTag'][0].to_s) if xml_video['videoPlayerEmbedTag']
data[:items] << new_video
}
return data
end
end
Solução
Parece que o problema que você está vendo é que quando Rails tentativas para processar um parcial para um objeto, ele será o padrão para usar o nome classe que do objeto como o nome para a parcial. Cada item individual em dados [: Artigos] é um Hash, por isso, em algum ponto você está tentando tornar um desses itens e Rails está à procura de um modelo _hash.html.erb. Eu acho que você quer mudar o código a seguir:
page.replace_html(
'broadcast_search_results',
:partial => @items
)
para:
page.replace_html(
'broadcast_search_results',
:partial => 'item',
:collection => @items
)
Isso deve tornar o _item.html.erb parcial para cada item na @items.