Ruby / Rails 1 & 2: problème de collecte
-
03-07-2019 - |
Question
Hé, je viens juste de commencer à apprendre le ruby ??/ les rails. Pour le moment, j'essaie de faire un exemple d'un livre allemand "Praxiswissen Ruby on Rails", assez ancien et écrit pour Ruby on Rails 1. Quoi qu'il en soit, j'ai essayé de faire les exemples avec Rails 2. Maintenant, j'ai problème depuis plus d'une semaine.
Selon le livre (Rails 1), je dois écrire dans mon contrôleur:
page.replace_html ( 'broadcast_search_result', : partiel = > 'broadcast_search_result', : collection = > @videos ['items'] );
J'ai découvert que cela dans Rails 2 est écrit de la même manière que:
@items = try (@videos [: items])
page.replace_html ( 'broadcast_search_results', : partiel = > @articles )
Mais le serveur envoie le message suivant:
ActionView :: MissingTemplate (Le hachage de modèle manquant / _hash.erb dans le chemin d'accès aux vues app / views):
app / controllers / stations_controller.rb: 46: dans `__instance_exec0 '
app / controllers / stations_controller.rb: 30: dans `search_broadcasts '
Je devrais créer un modèle hashes / _hash.erb à la place de stations / _item.erb. Quelqu'un peut-il m'aider, s'il vous plaît?
Merci beaucoup!
OK, je vais ajouter le code du contrôleur: 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
Le modèle broadcast.rb (pour 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
La solution
Il semble que le problème que vous rencontrez est que, lorsque Rails tente de restituer un partiel pour un objet, il utilise par défaut le nom de classe de cet objet comme nom pour le partiel. Chaque élément individuel dans data [: items] est un hachage. Par conséquent, vous tentez de rendre l'un de ces éléments et Rails recherche un modèle _hash.html.erb. Je pense que vous voulez changer le code suivant:
page.replace_html(
'broadcast_search_results',
:partial => @items
)
à:
page.replace_html(
'broadcast_search_results',
:partial => 'item',
:collection => @items
)
Ceci devrait rendre le partiel _item.html.erb pour chaque élément de @items.