Ruby on Rails路由器很奇怪

时间:2011-06-21 23:50:31

标签: ruby-on-rails ruby-on-rails-3 routing

我有一个带有非模型控制器的Rails 3应用程序,我用它来提供一系列幻灯片。 SlideController计算出之前&的正确ID。当前幻灯片,然后将该ID提供给视图中的link_to帮助器以用于转发&后退按钮。

第一页上前进按钮上的工具提示显示为:http://localhost:3000/slide/2/。当我右键单击它时,选择“复制链接位置”并将其粘贴到地址栏中,它可以正常工作。当我通过javascript调用url时,它可以工作。当我点击它时,它失败并显示消息

ActionController :: RoutingError(没有路由匹配“/ slide / slide / 2”)

想知道我的本地服务器是否有问题,我部署到Heroku,并得到了同样的错误。

为什么这个链接看起来很完美格式化,但路由器没有按照我的预期处理???

谢谢!

的routes.rb


RadioDose::Application.routes.draw do
    get "/slide/:id" => "slide#show", :as => 'slide'
    get "/slideshow" => "slide#show"
end

slide_controller.rb


class SlideController < ApplicationController
    def show
        @id = (params[:id].blank? ? '1' : params[:id])
        @slide_name = 'slide' + @id
        max_slide = 40
        @last_slide = (@id.to_i > 1 ? @id.to_i - 1 : 1)
        @next_slide = (@id.to_i < max_slide ? @id.to_i + 1 : max_slide)
    end
end

show.html.erb <%= render :partial => @slide_name %>

<%= link_to 'Back', slide_path(@last_slide), :id => 'left-arrow', :class => 'sprite' %> <%= link_to 'Next', slide_path(@next_slide), :id => 'right-arrow', :class => 'sprite' %>

Page <%= @id %> <%= javascript_include_tag 'slide' %>

1 个答案:

答案 0 :(得分:0)

您粘贴的错误消息会告诉您需要知道的所有信息。当您点击该链接时,系统会将您定向到http://localhost:3000/slide/slide/2而不是http://localhost:3000/slide/2。鉴于链接在您复制并粘贴时正常工作,并且您使用标准slide_path表明HTML中的链接是正确的,但是在您的javascript中发生了某种情况。

这可能只是将URL视为相对于当前页面而不是相对于root的简单情况。

顺便提一下,即使您的幻灯片未由数据库备份,您仍然可以在此处使用RESTful路由。如果您的整个应用只是一个幻灯片,请使用:

RadioDose::Application.routes.draw do
   resources :slides
end

或者如果您想支持多个幻灯片,那么:

RadioDose::Application.routes.draw do
   resources :slideshows do
      resources :slides
   end
end

然后,您可以显示幻灯片控制器的index操作中的第一张幻灯片,或者在第二个示例中显示幻灯片控制器的show操作。