2009-05-03 15 views
1

ちょっと、私はちょうどルビー/レールを学び始めました。現時点では、私はドイツ語の本「Praxiswissen Ruby on Rails」の例をしようとしています。これはかなり古いRuby on Rails 1のために書かれています。とにかく、私はRails 2で例を試みました。 1週間以上Ruby/Rails 1&2:コレクションの問題

本によると(レール1)私は自分のコントローラに書く必要があります:

page.replace_html( 'broadcast_search_result'、 :部分=> 'broadcast_search_result'、 :コレクション=> @ビデオ['items'] );

私はこのレール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 '

station/_item.erbではなく、テンプレートhashes/_hash.erbを作成する必要があります。誰でも助けてくれますか?

ありがとうございました!


OK、私は、コントローラのコードを追加します: stations_controller.rb:(Broadcast.get_videos用)

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を:

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でない限り、_hash.erbファイルを作成しないでください。コード内の何かがこのエラーを投げています。 –

+0

リクエストいただきありがとうございます。私はstation_controllerとブロードキャストモデルを追加しました(このモデルから私はハッシュを受け取ります) – 27leaves

答えて

1

は、それが表示されますあなたが見ている問題は、Railsがオブジェクトの一部をレンダリングしようとすると、デフォルトでそのオブジェクトのクラス名を部分クラスの名前として使用することになります。 data [:items]の個々のアイテムはハッシュなので、ある時点でそれらのアイテムの1つをレンダリングしようとしており、Railsは_hash.html.erbテンプレートを探しています。これは@items内の各アイテムの部分_item.html.erbをレンダリングする必要があり

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

:に

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

:私はあなたが以下のコードを変更したいと思います。

+0

ありがとうございました!なぜか分かりませんが、それはまさに本の解決策でした...今は正しいですが、とにかく何も描画しません。呼び出されたdivは空です。 – 27leaves

+0

OK今は幸せです。私の一部では、thumbnail_urlをタイプしましたが、アイテム[:thumbnail_url]です。どうもありがとうございました! – 27leaves

関連する問題