设计 - ActiveRecord :: RecordNotFound

时间:2016-01-22 00:30:17

标签: ruby-on-rails ruby activerecord devise

我希望用户拥有自己的页面/ 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;
&#13;
&#13;

2 个答案:

答案 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

会工作。