私は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
ご覧のとおり、名前空間のルートを使用していて、コントローラが動作しています。タスクを取得しようとすると、undefined method 'api_v1_task_url
というエラーが表示されます。私はヘルパーメソッドが含まれていない理由を理解できません。私は、このようなカスタム属性を追加する際に見つけるチュートリアルでは、これらの宝石(rails-api
およびactive_model_serializers
)を使用するための調整を行わないため、困惑しています。ここrake routes
の出力です: レールのバージョン:4.2.6 レール-APIバージョン:0.4.0 active_model_serializersバージョン:0.10.0.rc5
編集ここ
は、いくつかのより多くの関連情報であり、 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
undefined method 'link'
エラーを受け取りました。
編集3: @beaubyは、私はしかし、私が見てきたようシリアライザメソッドを介してこのような多数のチュートリアルで作業を属性を作成しません正しく、まだそれを使用して、間違った場所にこの方法を使用していたと指摘しました1:http://railscasts.com/episodes/409-active-model-serializers?view=asciicast。これは、JSONAPIスキーマの後にlinks
プロパティを作成します。これは有用で何かを覚えていますが、私が達成しようとしているものではありません。
'$ rake routes'の出力は何ですか? – beauby
'rake routes'の出力で更新されました –