2016-04-17 3 views
0

私は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プロパティを作成します。これは有用で何かを覚えていますが、私が達成しようとしているものではありません。

+0

'$ rake routes'の出力は何ですか? – beauby

+0

'rake routes'の出力で更新されました –

答えて

1

あなたは、あなたが次のようにあなたは、link定義の内部からそれを使用することができ属性定義内部からurl_helpersを使用することはできませんが、JsonApiアダプタを使用している場合:

class TaskSerializer < ActiveModel::Serializer 
    attributes :name 
    link(:self) { api_v1_task_url(object) } 
    end 
+0

これはうまくいきませんでした。エラーは '未定義のメソッド 'リンクです。このページ:https://github.com/rails-api/active_model_serializers/blob/master/docs/general/getting_started.mdには、 'Rails.application.routes.default_url_options'が設定されている必要がありますが、これまでのこれまでの幸運。 –

+0

これはメソッド内ではなく、シリアライザの定義の中に入れなければなりません。 – beauby

+0

それは正確に私がそれを置くところで、それが私にその誤りを与えたところです。 –

2

あなたは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 

また、あなたのActiveModelアダプタとして:jsonを使用して手動でリソースの場所を追加することができます。

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

    attributes :name, :resource_location 

    def resource_location 
     api_v1_task_url(object) 
    end 
    end 
関連する問題