0

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

找不到 id=login 的帖子

在这一点上,我们不再是根。在这种情况下,地址栏显示:

http://localhost:3000/posts/login

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

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

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

任何线索,任何人?

4

2 回答 2

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>
于 2013-07-10T20:30:04.930 回答
0

我终于设法解决了这个问题。以下是未来可能遇到的人的解决方案:

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

如果您超出了作为根的控制器(在本例中为“页面”)的边界,以到达另一个控制器上的另一个页面/链接,例如帖子控制器并尝试到达“页面”上的页面' 控制器,例如:

     http://localhost:3000/posts/about

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

以下是 site_pages 控制器的路由(未触及):[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'

以下是从该控制器请求的帖子控制器的新路由: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

注意。如果 Devise 链接没有包含在 Devise 范围内,Rails 将返回错误。

我希望这有帮助。

于 2013-07-13T14:28:08.707 回答