質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

1486閲覧

rails map内でメソッドを呼び出す方法

ocms

総合スコア53

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/05/13 09:07

モデル
###前提・実現したいこと
railsのGrapeを利用してUserモデルのレコードを返すAPIを作成しています。

mapでの処理が今後長くなるため、map処理内のメソッドをuser_attributes3のように外出ししようと考えています。

###発生している問題・エラーメッセージ
mapからメソッドuser_attributes3を呼び出すことができない。
そもそも、この表記方法はただしくないでしょうか。

NoMethodError (undefined method `sample_attribute' for #<User:0x007fc50adaf6c0>

どうぞよろしくお願いいたします。

###該当のソースコード

ruby

1module Resources 2 module V1 3 class Root < Grape::API 4 version 'v1' 5 format :json 6 content_type :json, 'application/json' 7 helpers do 8 def user_attributes2 9 User.all.map(&:attributes) 10 end 11 12 def user_attributes3(table) 13 table.attributes 14 end 15 end 16 # 期待する結果が帰ってくる 17 resource :user_attributes1 do 18 get do 19 User.all.map(&:attributes) 20 end 21 end 22 # 期待する結果が帰ってくる 23 resource :user_attributes2 do 24 get do 25 user_attributes2 26 end 27 end 28 # エラー 29 resource :user_attributes3 do 30 get do 31 User.all.map(&:user_attributes3) 32 end 33 end 34 35 # app/api/resources/v1/users.rbをマウント 36 mount Resources::V1::Users 37 38 # swaggerの設定 39 if defined? GrapeSwaggerRails 40 add_swagger_documentation( 41 #uninitialized constant GrapeSwagger::Markdown (NameError) 42 #markdown: GrapeSwagger::Markdown::RedcarpetAdapter, 43 #markdown: GrapeSwagger::Markdown::RedcarpetAdapter.new(render_options: { highlighter: :rouge }), 44 api_version: 'v1', 45 base_path: '/api', 46 hide_documentation_path: true, 47 hide_format: true 48 ) 49 end 50 end 51 end 52end

期待する結果

[ { "id": 1, "name": "Nike", "age": 13, "created_at": "2017-05-09T00:41:28.217Z", "updated_at": "2017-05-09T00:41:28.217Z" }, { "id": 2, "name": "Kukuri", "age": 13, "created_at": "2017-05-09T00:41:28.220Z", "updated_at": "2017-05-09T00:41:28.220Z" }, ]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

User.all.map(&:method)と書くと、「すべてのUserが入ったコレクションに対して、user.methodを呼び出して実行した結果を返す」という意味になるので、Userメソッドが呼ばれます。

それ以外のものを呼び出したいなら、ブロックで書けばいいでしょう(なお、GRAPEにあまり詳しくないので、これで動くかは保証の限りではありません)。

User.all.map { |user| user_attributes3 user }

投稿2017/05/13 12:47

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問