gpt4 book ai didi

active-model-serializers - 事件模型序列化器 - 路由助手的未定义方法

转载 作者:行者123 更新时间:2023-12-05 08:42:57 24 4
gpt4 key购买 nike

我正在使用 rails-api gem 构建一个新应用程序。我正在使用 active_model_serializers 来自定义我的 JSON 响应。在尝试向序列化程序添加 url 属性时,我收到一条错误消息,指出我的资源的路由帮助程序方法未定义。要遵循的相关代码:

# Routes
Rails.application.routes.draw do
namespace :api, defaults: { format: 'json' } do
namespace :v1 do
resources :tasks, except: [:new, :edit]
end
end
end

# Controller - api/v1/tasks_controller.rb
class Api::V1::TasksController < ApplicationController
before_action :set_task, only: [:show, :update, :destroy]

# GET /tasks
# GET /tasks.json
def index
@tasks = Task.all

render json: @tasks
end

# GET /tasks/1
# GET /tasks/1.json
def show
render json: @task
end

# POST /tasks
# POST /tasks.json
def create
@task = Task.new(task_params)

if @task.save
render json: @task, status: :created, location: api_v1_task_path(@task.id)
else
render json: @task.errors, status: :unprocessable_entity
end
end

# PATCH/PUT /tasks/1
# PATCH/PUT /tasks/1.json
def update
@task = Task.find(params[:id])

if @task.update(task_params)
head :no_content
else
render json: @task.errors, status: :unprocessable_entity
end
end

# DELETE /tasks/1
# DELETE /tasks/1.json
def destroy
@task.destroy

head :no_content
end

private

def set_task
@task = Task.find(params[:id])
end

def task_params
params.require(:task).permit(:name)
end
end

# Serializer
class TaskSerializer < ActiveModel::Serializer
attributes :id, :name, :url

def url
api_v1_task_url(object)
end
end

如您所见,我正在使用命名空间路由并让 Controller 正常工作。当我尝试检索任务时收到 undefined method 'api_v1_task_url 错误。我不明白为什么不包括辅助方法。我感到困惑,因为我找到的每一个关于添加自定义属性的教程都没有对使用这些 gem(rails-apiactive_model_serializers)进行任何调整。

这里有一些更相关的信息: 轨道版本:4.2.6 rails-api 版本:0.4.0 active_model_serializers 版本:0.10.0.rc5

编辑:这是rake routes

的输出
     Prefix Verb    URI Pattern                 Controller#Action
api_v1_tasks GET /api/v1/tasks(.:format) api/v1/tasks#index {:format=>"json"}
POST /api/v1/tasks(.:format) api/v1/tasks#create {:format=>"json"}
api_v1_task GET /api/v1/tasks/:id(.:format) api/v1/tasks#show {:format=>"json"}
PATCH /api/v1/tasks/:id(.:format) api/v1/tasks#update {:format=>"json"}
PUT /api/v1/tasks/:id(.:format) api/v1/tasks#update {:format=>"json"}
DELETE /api/v1/tasks/:id(.:format) api/v1/tasks#destroy {:format=>"json"}

编辑 2: 按照下面的建议,我尝试了:

# Serializer
class TaskSerializer < ActiveModel::Serializer
attributes :id, :name, :url

def url
link(:self) { api_v1_task_url(object) }
end
end

并收到一个未定义方法'link'错误。

编辑 3: @beauby 确实指出我在不正确的地方使用了这个方法,但是正确使用它仍然不会通过序列化程序方法创建属性,因为我已经看到很多工作像这样的教程:http://railscasts.com/episodes/409-active-model-serializers?view=asciicast .它在 JSONAPI 架构之后创建了一个 links 属性,这虽然很有帮助而且我会记住,但这并不是我想要完成的。

最佳答案

您可以将 Rails.application.routes.url_helpers 添加到您的 TaskSerializer 以使用 url_helpers。

  class TaskSerializer < ActiveModel::Serializer
include Rails.application.routes.url_helpers

attributes :name

link(:self) { api_v1_task_url(object) }
end

您还可以使用 :json 作为您的 ActiveModel 适配器并手动添加资源位置。

  class TaskSerializer < ActiveModel::Serializer
include Rails.application.routes.url_helpers

attributes :name, :resource_location

def resource_location
api_v1_task_url(object)
end
end

关于active-model-serializers - 事件模型序列化器 - 路由助手的未定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36682093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com