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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

Q&A

解決済

2回答

5590閲覧

railsでモデルをコントローラーから呼び出す

soft_admin

総合スコア63

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

0グッド

0クリップ

投稿2019/08/12 23:33

編集2019/08/13 01:06

railsを勉強中です。
モデルをコントローラーから呼び出す方法を教えてください。
コントローラーでモデルのファイルをrequireすればよいのかと思ったのですが、
NoMethodErrorが発生します。

・コントローラー
index_controller.rb

ruby

1require "user.rb" 2 3class HomesController < ApplicationController 4 5 def index 6 @db_user = User.user_info 7 render "homes/index" 8 9 end 10 11end 12

・モデル
user.rb

ruby

1class User < ApplicationRecord 2 3 def user_info 4 db_user = "ユーザー名" 5 return db_user 6 end 7 8end 9

追記:下記のように修正しました。NoMethodErrorがでます。

・コントローラー
index_controller.rb

ruby

1class HomesController < ApplicationController 2 3 def index 4 @db_user = User.user_info 5 render "homes/index" 6 end 7 8end 9

・モデル
user.rb

ruby

1class User < ApplicationRecord 2 3 def user_info 4 user = User.find(1) 5 info = user.name 6 return info 7 end 8 9end 10

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

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

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

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

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

asm

2019/08/12 23:45

user_infoメソッドについて、単純に"ユーザー名"という文字列を返したいのでしょうか? それとも、データベースに登録されている情報を用いた何かを返したいのでしょうか?
soft_admin

2019/08/12 23:49

データベースに登録されている情報を返すように実装するつもりですが、とりあえずシンプルに値を返すだけの処理を書いてみました。
guest

回答2

0

ベストアンサー

そもそものエラーの原因の話ですが

rb

1class User < ApplicationRecord 2 def user_info 3 user = User.find(1) 4 info = user.name 5 return info 6 end 7end

ここで定義されているuser_infoはインスタンスメソッドです。一方、

rb

1class HomesController < ApplicationController 2 def index 3 @db_user = User.user_info 4 render "homes/index" 5 end 6end

ここで使われているuser_infoはクラスメソッドです。

user_infoクラスメソッドが定義されていないのでNoMethodErrorが発生しています。

投稿2019/08/13 05:03

Mugheart

総合スコア2340

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

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

soft_admin

2019/08/13 10:43

おっしゃる通りでした。 ありがとうございました。
guest

0

まず、

require "user.rb"

については、必要ありません。
すでにロードされています。

データベースをfindfind_by where等で検索し目当てのレコードを取り出す必要があります。

例えば

ruby

1# idが1のレコード 無い場合は例外が飛び 404になる 2user = User.find(1) 3 4# nameカラムがhogeのレコードの先頭 5# find_byだと無い場合はnilが返り 6# find_by!だと無い場合は例外が飛び 404になる 7user = User.find_by!(name: "hoge") 8 9# params[:id]をもちいてURLやPOSTされたパラメータから取り出す事が多い 10user = User.find(params[:id]) 11 12info = user.user_info

ruby

1# 全てのレコード 2users = User.all 3 4# nameカラムがhogeのレコード 全て 5users = User.where(name: "hoge") 6 7# ageカラムが10..18のどれか 8users = User.where(age: 10..18) 9 10# ageカラムが18より上 11users = User.where("age > ?", 18) 12 13# allやwhereで取り出した場合はRelationという配列のような検索条件的な物が返り 14# eachなどで各々のレコードを呼び出せる 15infos = users.map{|user| user.user_info }

以下追記

普通、データベースには以下のように複数のレコードが保存されます。

例: ユーザー毎のテストの得点

idnamescore
1hoge100
2foo50
3bar85

これに対して、「コントローラーからモデルを呼び出したい」ときというのは大別して2パターン考えられます。
a. 全てのユーザーの平均点が欲しい
b. ある1人のユーザーの得点が欲しい

データベースに入ってる得点が実際の点数の10分の1だったとします。
(メソッドを作る理由を無理やり作っただけです。)

a. 平均点を計算するメソッドが欲しい場合
注意: 大抵のものはRailsが用意しています。 Rails tips: ActiveRecord count系機能の基本と応用(翻訳)

ruby

1# user.rb 2class User < ApplicationRecord 3 # クラスメソッド 4 def self.my_ave 5 User.average(:score) * 10.0 6 end 7end 8 9# controller.rb 10 def index 11 @average = User.my_ave 12 end

b. ある1人のユーザーの得点が欲しい

ruby

1# user.rb 2class User < ApplicationRecord 3 # インスタンスメソッド 4 def get_score 5 score * 10 6 end 7end 8 9# users_controller.rb 10class UsersController < ApplicationController 11 def show 12 user = User.find(params[:id]) 13 @score = user.get_score 14 end 15end 16 17# params[:id]は routes.rbに 18# get '/users/:id', to: 'users#show' 19# や 20# resources :users 21# と 22# 書いてある等の場合につかえます。 23# そうでない場合は、なんらかの方法でデータベースを検索させる必要があります。

投稿2019/08/13 00:16

編集2019/08/13 03:38
asm

総合スコア15147

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

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

soft_admin

2019/08/13 01:03

すみません...上の回答だとどこに何を書けば良いのかが分からないです。 info = user.user_info は何が入ってくるのでしょうか?
asm

2019/08/13 01:15

コントローラーから ということなので コントローラーに記載するものを提示しています
soft_admin

2019/08/13 02:44

DBからデータを取得するロジックは、モデルに書くべきだと思っていたのですが、そうではないのですか? コントローラーからモデル内のDB取得をする関数を呼び出す、というイメージだったのですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問