2012-02-22 3 views
1

Я только что обновил приложение рельсов 3.0.9 до рельсов 3.2.1, просмотрев railscasts для обновления до рельсов 3.1.0, а затем 3.2.0. Перед обновлением мой (тогда работал) routes.rb файл выглядел:Маршрутизация с рельсами 3.2.1

match "home" => "pages#index" 
match "*page" => "pages#show" 
root :to => "pages#index" 

После обновления я изменил мой файл routes.rb в:

match "home" => "pages#index" 
match "pages/*page" => "pages#show", :format => false 
root :to => "pages#index" 

Я получил эту идею от Ruby on Rails routing в Мамаевом Секция Globbing, чтобы имитировать рельсы версии 3.0.x.

Теперь, когда я нажимаю на моей ссылке, вынесенным:

<li><%= link_to "What We Do", "/what-we-do" %></li> 

Я получаю эту ошибку:

Routing Error 
No route matches [GET] "/what-we-do" 
Try running rake routes for more information on available routes. 

rake routes produces: 

    home /home(.:format) pages#index 
      /pages/*page pages#show 
    root/    pages#index 
If that is helpful. 

страница Я пытаюсь сделать то, что называется, мы-do.html .erb и находится в app/views/pages.

и это мой контроллер:

class PagesController < ApplicationController 

    def index 
    render :home, :layout => false 
    end 

    def show 
    render static_page 
    rescue 
    # page_not_found 
    end 


    private 

    def static_page 
    "#{RAILS_ROOT}/app/views/pages/#{params[:page]}.html.erb" 
    end 

    def page_not_found 
    render "#{Rails.root}/public/404.html", :layout => false 
    end 

end 

Кто-нибудь есть какие-либо предложения?

+1

Так что я понял это. Я переключил свой маршрут обратно на: 'match '* page" => "pages # show", но реальная проблема была в моем контроллере. В rails 3.0.X вы используете RAILS_ROOT, но в 3.1, и это Rails.root. Спасибо всем – scommette

ответ

3

маршрут члена потребует ID, так как он действует на члене. Маршрут сбора не происходит потому, что он действует на коллекцию объектов.

map.resources :users, :collection => { :customers_list=> :get } 

map.resources :users, :member => { :inactive=> :post } 

Это рассматривается как /users/1;inactive=> [:action => 'inactive', :id => 1]

1

маршруты должно быть, как это -

match "home", :to => "pages#index" 
root :to => "pages#index" 
match ":page", :to => "pages#show" 
2

У вас есть маршрут, который соответствовал бы /pages/what-we-do:

/pages/*page pages#show 

но нет ничего, что будет соответствовать URL, который не начинается с /pages/ (кроме /home, конечно). Вы все еще нужна ваша верхнего уровня globbed маршрут:

match "*page" => "pages#show" 

, если вы хотите, чтобы соответствовать /what-we-do. Возможно, вы поняли this from the routing guide:

Starting from Rails 3.1, wildcard routes will always match the optional format segment by default. For example if you have this route:

match '*pages' => 'pages#show' 

By requesting "/foo/bar.json" , your params[:pages] will be equals to "foo/bar" with the request format of JSON.

Изменение в том, что вам не придется иметь дело с обработкой себя формат, теперь автоматически обрабатывается так же, как и для всех остальных маршрутов.

0

Похоже, вы не указали предполагаемое действие на маршрутах. если вы используете статический маршрут внутри любых подмостей следует отметить, что действие в маршрутах внутри

collection :controller do 
    get 'action name' 
end 
Смежные вопросы