rails: ActiveRecord_Relation 与 Jbuilder 的未定义方法
rails: undefined method for ActiveRecord_Relation with Jbuilder
我有一个名为 RequestForm 的模型,我想在示例 Web 界面中呈现种子数据。
这个模型的结构是这样的:
table:
create_table "request_forms", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.date "request_date"
t.string "submit_by"
t.string "submit_to"
t.string "requester_name"
end
种子数据:
RequestForm.delete_all
RequestForm.create! (
[
{
requester_name: "David",
request_date: Date.new(2017,1,2)
},
{
requester_name: "Mike",
request_date: Date.new(2018,1,3)
},
{
requester_name: "Jack",
request_date: Date.new(2018,1,3)
}
]
)
控制器看起来像这样:
class Api::RequestFormsController < ApplicationController
def show
@RequestForm = RequestForm.find(param[:id])
end
def index
@RequestForms = RequestForm.all
end
end
routes.rb 中也有资源
namespace :api, defaults: { format: :json } do
resources :request_forms, only: [ :index, :show ]
end
当我尝试用一行创建一个 jbuilder 文件时:
json.extract! @RequestForms, :requester_name, :request_date
这就是 500(内部服务器错误)发生的地方。我点击了错误消息,它说:
undefined method `requester_name' for #<RequestForm::ActiveRecord_Relation:0x00007f2c0a879f28>
我不知道为什么它期待一个关系,因为从 link 这里的文档:http://www.rubydoc.info/github/rails/jbuilder/Jbuilder:extract!
Extracts the mentioned attributes or hash elements from the passed object and turns them into attributes of the JSON.
我只是按照它提供的示例进行操作。那么我在这里做错了什么?
由于您在 jbuilder 模板中使用 @RequestForms
,我假设您正在尝试呈现索引操作。
json.extract! @RequestForms, :requester_name, :request_date
在这种情况下,@RequestForms
是一个 RequestForm::ActiveRecord_Relation
,而不是 RequestForm
对象。我认为您正在寻找的是 json.array!
来帮助您呈现您拥有的对象集合。
例如,您可以这样做:
json.array! @RequestForms do |request_form|
json.requester_name request_form.requester_name
json.request_date request_form.request_date
end
尽管如此,您的代码已经非常接近工作了。您可以简单地使用 json.array!
来直接从数组中提取属性,而不是 json.extract!
。
json.array! @RequestForms, :requester_name, :request_date
official jbuilder documentation 展示了这种技术:
# @people = People.all
json.array! @people, :id, :name
# => [ { "id": 1, "name": "David" }, { "id": 2, "name": "Jamie" } ]
我有一个名为 RequestForm 的模型,我想在示例 Web 界面中呈现种子数据。
这个模型的结构是这样的:
table:
create_table "request_forms", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.date "request_date"
t.string "submit_by"
t.string "submit_to"
t.string "requester_name"
end
种子数据:
RequestForm.delete_all
RequestForm.create! (
[
{
requester_name: "David",
request_date: Date.new(2017,1,2)
},
{
requester_name: "Mike",
request_date: Date.new(2018,1,3)
},
{
requester_name: "Jack",
request_date: Date.new(2018,1,3)
}
]
)
控制器看起来像这样:
class Api::RequestFormsController < ApplicationController
def show
@RequestForm = RequestForm.find(param[:id])
end
def index
@RequestForms = RequestForm.all
end
end
routes.rb 中也有资源
namespace :api, defaults: { format: :json } do
resources :request_forms, only: [ :index, :show ]
end
当我尝试用一行创建一个 jbuilder 文件时:
json.extract! @RequestForms, :requester_name, :request_date
这就是 500(内部服务器错误)发生的地方。我点击了错误消息,它说:
undefined method `requester_name' for #<RequestForm::ActiveRecord_Relation:0x00007f2c0a879f28>
我不知道为什么它期待一个关系,因为从 link 这里的文档:http://www.rubydoc.info/github/rails/jbuilder/Jbuilder:extract!
Extracts the mentioned attributes or hash elements from the passed object and turns them into attributes of the JSON.
我只是按照它提供的示例进行操作。那么我在这里做错了什么?
由于您在 jbuilder 模板中使用 @RequestForms
,我假设您正在尝试呈现索引操作。
json.extract! @RequestForms, :requester_name, :request_date
在这种情况下,@RequestForms
是一个 RequestForm::ActiveRecord_Relation
,而不是 RequestForm
对象。我认为您正在寻找的是 json.array!
来帮助您呈现您拥有的对象集合。
例如,您可以这样做:
json.array! @RequestForms do |request_form|
json.requester_name request_form.requester_name
json.request_date request_form.request_date
end
尽管如此,您的代码已经非常接近工作了。您可以简单地使用 json.array!
来直接从数组中提取属性,而不是 json.extract!
。
json.array! @RequestForms, :requester_name, :request_date
official jbuilder documentation 展示了这种技术:
# @people = People.all
json.array! @people, :id, :name
# => [ { "id": 1, "name": "David" }, { "id": 2, "name": "Jamie" } ]