嘿,我刚开始学习红宝石/铁轨。目前,我试着做一本德国书籍“Praxiswissen Ruby on Rails”的例子,这本书很老,是为Ruby on Rails 1编写的。无论如何,我试着用Rails 2做例子。现在我有了问题超过一周。

根据书(Rails 1),我必须在我的控制器中写:

  

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

我发现Rails 2中的内容类似于:

  

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

     

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

但服务器会抛出以下消息:

  

ActionView :: MissingTemplate(在视图路径app / views中缺少模板哈希/ _hash.erb):

     

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

     

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

我应该创建模板哈希/ _hash.erb而不是station / _item.erb。请问有人帮帮我吗?

非常感谢!


好的,我将添加控制器代码: 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
有帮助吗?

解决方案

您看到的问题似乎是当Rails尝试渲染对象的部分时,它将默认使用该对象的类名作为partial的名称。数据[:items]中的每个单独项都是一个哈希,所以在某些时候你试图渲染其中一个项目,而Rails正在寻找一个_hash.html.erb模板。我想你想改变以下代码:

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

为:

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

这应该为@items中的每个项呈现_item.html.erb部分。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top