1

我继承了一个旧的 Rails 应用程序,我真的在为这个错误而苦苦挣扎:

ActionController::RoutingError 
    (No route matches {:controller=>"users", :action=>"profile"}):
app/views/layouts/application.html.erb:59:in
    `_app_views_layouts_application_html_erb__105<snip>'
app/controllers/users_controller.rb:40:in `index'

我仅在以管理员身份登录时出现此错误,而不是以任何其他用户身份登录。

这是我的路线.rb

Vvault::Application.routes.draw do
  resources :orders

  devise_for :users

  resources :videos

  resources :users

  root :to => "users#index"

  match 'users/:id/profile' => 'users#profile', :as => :user_profile
end

我认为这是来自 users_controller.rb 的相关片段:

def index
  if current_user.admin?
    # admin sees all users
    @users = User.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @users }
    end
  else
    redirect_to "/users/" + current_user.id.to_s() and return
  end
end

我认为这是来自 application_html.erb 的相关片段:

<div class="sidebar">
    <% if user_signed_in? %>
      <%= link_to "My account", user_profile_path, :method => :get %>
    <% end %>
 </div>     

如果我注释掉 application_html.erb 的第三行,我可以以管理员身份登录,但显然配置文件链接不会为任何用户呈现。

任何帮助表示赞赏。

谢谢!

4

3 回答 3

3

尝试:

<%= link_to "My account", user_profile_path(current_user.id), :method => :get %>
于 2013-02-01T05:15:19.823 回答
0

您的user_profile_path助手需要id传入一个,因为相应的路由有一个:id参数。

错误消息告诉您,在没有任何其他参数的情况下,该控制器/操作组合不存在路由。

或者,您需要定义一个不带参数的路由id,控制器会自动加载当前用户的配置文件

于 2013-02-01T02:39:28.147 回答
0

您需要将 id 提供给user_profile_path. 但是由于该路由指向用户的帐户,因此设置 id 没有意义,因为它应该始终是当前用户(这是您的意图吗?)。如果是这种情况,那么您可以将路线重写为:

match 'users/profile' => 'users#profile', :as => :user_profile

如果没有,则为您的路线的辅助方法提供一个 id。

于 2013-02-01T02:40:06.410 回答