如果我将before_action :authenticate_user!
添加到ApplicationController
,则会收到错误消息:
ActionView::Template::Error (undefined method `name' for nil:NilClass):
1: json.data @users, :name, :username
此文件的内容:
show.jbuilder
json.data @users, :name, :username
我的控制器:
users_controller.rb
class UsersController < ApplicationController
before_action :authenticate_user!
def index
@users = User.all
end
end
如果我删除before_action :authenticate_user!
一切正常,我会获得用户列表的JSON对象。
为什么会这样?设备通常会返回401
,但devise_token_auth
正在尝试触发我的show
并因为无法访问数据库而失败。如何解决这种奇怪的行为?
答案 0 :(得分:1)
您的控制器非常特殊,您的错误是您正在将集合发送到为单个资源构建的视图。
在Rails中,show动作对应于查看单个资源,通常依赖于通过:id
参数传递ID:
class UsersController < ApplicationController
# GET /users
def index
@users = User.all
end
# GET /users/:id
def show
@user = User.find(params[:id])
end
end
您也不需要显式调用渲染。
应用程序/视图/用户/ show.json.jbuilder:
json.(@user, :name, :username)
应用程序/视图/用户/ index.json.jbuilder:
json.comments @user do |json, user|
json.(user, :name, :username)
end