2009-05-03 52 views
1

嘿,我剛開始學習ruby/rails。目前,我嘗試做一本德語書籍「Praxiswissen Ruby on Rails」的例子,這本書很古老,是爲Ruby on Rails 1編寫的。無論如何,我試圖用Rails 2做例子。現在我遇到了問題超過一個星期。Ruby/Rails 1&2:收集問題

根據書(軌道1)我在我的控制器寫入:

page.replace_html( 'broadcast_search_result', :局部=> 'broadcast_search_result', :採集=> @視頻['items'] );

我發現這個Rails中2被寫入類似於:

@items =嘗試(@videos [:項目])

page.replace_html( 'broadcast_search_results' , :局部=> @items )

但是服務器拋出以下消息:

::的ActionView MissingTemplate(缺少模板散列/鑑於路徑應用_hash.erb /觀看次數):

應用程序/控制器/ stations_controller.rb:46:在`__instance_exec0'

應用程序/控制器/stations_controller.rb:30:in`search_broadcasts'

我應該創建一個模板哈希/ _hash.erb而不是站點/ _item.erb。有人可以幫我嗎?

非常感謝!


OK,我將添加控制器代碼: 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&uuml;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 

模型broadcast.rb(用於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 
+0

如果您可以粘貼控制器代碼的其餘部分,這將有所幫助。您不應該創建_hash.erb文件,除非該對象被命名爲散列。所以你的代碼中的其他內容會拋出這個錯誤。 – 2009-05-03 13:18:15

+0

謝謝你的要求,我添加了station_controller和廣播模型(從這個模型我收到散列) – 27leaves 2009-05-03 16:55:31

回答

1

看樣子你看到的問題是,當Rails試圖渲染一個對象的部分時,它將默認使用該對象的類名作爲部分的名稱。 data [:items]中的每個單獨項目都是哈希,所以在某些時候您試圖呈現其中一個項目,而Rails正在尋找_hash.html.erb模板。我想你想更改下面的代碼:

page.replace_html(
    'broadcast_search_results', 
    :partial => @items 
) 

到:

page.replace_html(
    'broadcast_search_results', 
    :partial => 'item', 
    :collection => @items 
) 

這應該使_item.html.erb部分在@items每個項目。