我希望用户拥有自己的页面/ users / 52。所以我确实添加了一个新的控制器来实现这一点,控制器是user_controller.rb。 但现在,其他功能已经发挥作用。
当我有如下路线时。 / users / sign_in不起作用。 但/ users / 1确实有效。
#Users/show!!!
match 'users/:id' => 'users#show', via: :get
# or
get 'users/:id' => 'users#show'
# or
resources :users
devise_for :users, controllers: {
sessions: 'users/sessions'
}
当我使用如下路线时。 / users / 1工作但是用户/ sign_in工作。
devise_for :users, controllers: {
sessions: 'users/sessions'
}

class UsersController < ApplicationController
#def show
# @user = User.friendly.find(params[:id])
# @links = Link.all.where(user_id: @user).publish
#end
def index
@users = User.all
end
def show
@user = User.friendly.find(params[:id])
@links = Link.all.where(user_id: @user).publish
end
def new
end
end
&#13;
答案 0 :(得分:0)
发生的事情是,在请求“users / sing_in”时,您的控制器正在寻找ID为“sign_in”的记录,这样的记录不存在,因此找不到activerecord错误。
你应该放置''user /:id'=&gt; '用户#show' “devise_for”阻止,不在之前。
答案 1 :(得分:0)
我认为您只需要在设计声明之后移动resources :users
(或您拥有的其他变体)。首先出现的映射在routes文件中具有优先级,因此所有类型为'users / anything`的get请求都将匹配您的用户#show action并且永远不会访问设计控制器。让我们来看一个例子:
当用户尝试访问users/sign_in
时,rails会开始将路径与路径文件中的映射匹配,从上到下,当它到达users/:id
时,它会假定'sign_in'表示作为:id
的值(因为路径结构匹配),所以它选择了users#show
动作,如果你在show动作中查看参数,你会看到id
已经被赋予了值'sign_in'。
如果在users/:id
块之后放置devise_for
映射,则输入路径将首先匹配更严格的映射(例如,只有路径users/sign_in
匹配{{1}的映射然后是更广泛的users/sign_in
简而言之:
users/:id
会工作。