添加Blog组件时Rails中的路由问题

时间:2013-07-10 19:50:02

标签: ruby-on-rails

该应用程序正常运行,直到我们添加了博客。然后,我们开始遇到一些路由问题。导航栏上的每个链接仍然可以正常工作,包括博客链接,它会打开所有帖子的索引。当您单击其中一个链接转到特定帖子时,页面将按原样显示。但是,为了让用户发表评论,他/她需要登录或注册。所以,我们在页面上放了两个链接。问题是,当您单击其中一个链接或导航栏上的任何其他链接时,您会收到一条错误消息,典型消息如下:

找不到具有id = login

的帖子

此时,我们不再是根源了。在这种情况下,地址栏显示为:

http://localhost:3000/posts/login

到达root用户的唯一方法是单击页面上的“返回”链接,该链接将用户带回博客索引页面。

这是我的路线文件的样子:

Septactus::Application.routes.draw do  
  devise_for :admins
  devise_for :users, :path => "auth", :path_names => { 
                                                   :sign_in => 'login', 
                                                   :sign_out => 'logout', 
                                                   :password => 'secret', 
                                                   :confirmation => 'verification', 
                                                   :unlock => 'unblock', 
                                                   :registration => 'register', 
                                                   :sign_up => 'cmon_let_me_in' 
                                                  }
 devise_for :users, :controllers => {:registrations => 'registrations'}

 match '/home',         :to => 'site_pages#home'
 match '/about',        :to => 'site_pages#about'
 match '/bookshelf',    :to => 'books#index'
 match '/blog',         :to => 'posts#index'
 match '/icasts',       :to => 'site_pages#icasts'
 match '/portfolio',    :to => 'site_pages#portfolio'

 devise_scope :user do 
   match "login",   :to => 'devise/sessions#new'
   match 'logout',  :to => 'devise/sessions#destroy'
   match 'signup',  :to => 'devise/registrations#create'
 end

 resources :site_pages
 resources :books
 resources :users
 resources :posts do
  resources :comments
 end

 root :to => 'site_pages#home'

end

任何线索,任何人?

2 个答案:

答案 0 :(得分:1)

以下是此行中的问题:

<p>To add a comment, <%= link_to 'Login', 'login' %> or <%= link_to 'Signup', "signup" %></p>

您需要更改为

<p>To add a comment, <%= link_to 'Login', login_path %> or <%= link_to 'Signup', signup_path %></p>

答案 1 :(得分:0)

我终于设法解决了这个问题。对于那些将来可能会遇到它的人来说,这是一个解决方案:

众所周知,Rails路由使用controller#action指定到页面的路由:例如:pages#home

如果超出控制器的边界(在本例中为“页面”),这是根,可以到达另一个控制器上的另一个页面/链接,例如帖子&#39;控制器并尝试访问“页面”控制器上的页面,例如:

     http://localhost:3000/posts/about

你会收到错误。那是因为routes.rb不包含你所在地的那条链接的路径,所以你必须告诉它如何到达那里。这正是我所做的:

以下是site_pages&#39;的路线(未触及)。 controller:[http:// localhost:3000]

match '/home',         :to => 'site_pages#home'
match '/about',        :to => 'site_pages#about'
match '/bookshelf',    :to => 'books#index'
match '/blog',         :to => 'posts#index'
match '/icasts',       :to => 'site_pages#icasts'
match '/portfolio',    :to => 'site_pages#portfolio'

以下是帖子的新路线&#39;从该控制器请求的控制器:http:// localhost:3000 / posts / [id] /

match "/posts/home(.:format)"      => "site_pages#home", :as      => :home
match "/posts/about(.:format)"     => "site_pages#about", :as     => :about
match "/posts/bookshelf(.:format)" => "books#index", :as          => :bookshelf
match "/posts/blog(.:format)"      => "posts#index",   :as        => :blog
match "/posts/icasts(.:format)"    => "site_pages#icasts", :as    => :icasts
match "/posts/portfolio(.:format)" => "site_pages#portfolio",:as  => :portfolio

以下是来自帖子的设计'登录','注销'和'注册'链接的路线。控制器(最后3行):

devise_scope :user do 
  match "login",          :to  => 'devise/sessions#new'
  match 'logout',         :to  => 'devise/sessions#destroy'
  match 'signup',         :to  => 'devise/registrations#create'
  match "/posts/login",   :to  => "devise/sessions#new"
  match "/posts/logout",  :to  => "devise/sessions#destroy"
  match "/posts/signup",  :to  => "devise/sessions#create"
end

NB。如果Devise链接未包含在Devise范围内,则Rails将返回错误。

我希望这会有所帮助。