Frage

Hey, ich fing einfach an zu lernen, ruby/rails.Im moment versuche ich ein Beispiel für ein Deutsches Buch "Praxiswissen Ruby on Rails", die ist ziemlich alt und geschrieben für Ruby on Rails 1.Wie auch immer, ich habe versucht zu tun die Beispiele mit Rails 2.Jetzt habe ich problem seit über einer Woche.

Laut dem Buch (Rails 1) ich habe das schreiben in meinem controller:

Seite.replace_html( 'broadcast_search_result', :partial => 'broadcast_search_result', :collection => @videos['items'] );

Ich fand heraus, dass dies in Rails 2 geschrieben ist ähnlich:

@items = try(@videos[:items])

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

Aber der server wird folgende Meldung angezeigt:

ActionView::MissingTemplate (Missing template hashes/_hash.erb in Sicht Pfad app/views):

app/controllers/stations_controller.rb:46:in `__instance_exec0'

app/controllers/stations_controller.rb:30:in `search_broadcasts'

Sollte ich eine Vorlage erstellen, die hashes/_hash.erb statt Stationen/_item.erb.Kann jemand mir helfen, bitte?

Danke sehr viel!


OK, ich ' ll fügen Sie die controller-code: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

Die model-Sendung.rb (für 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
War es hilfreich?

Lösung

Es scheint, dass das problem, das Sie sehen, ist, dass, wenn Schienen versuche zu Rendern teilweise für ein Objekt, wird er standardmäßig verwendet das Objekt der Klasse als Namen für die teilweise.Jedes einzelne Element in data[:items] ist ein Hash, also an einem gewissen Punkt, den Sie versuchen zu Rendern dieser Elemente und Schienen ist auf der Suche nach einem _hash.html.erb-Vorlage.Ich denke, Sie möchten, ändern Sie den folgenden code:

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

zu:

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

Diese sollte machen die _item.html.erb teilweise für jedes Element in @items.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top