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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

248閲覧

Railsのモデルとコントローラのこーど記述について教えてください。

koume

総合スコア458

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/10/23 07:06

Rails5.1.3でWebアプリケーション制作の勉強中です。
ものすごく初歩的な質問になります。
Scoresテーブルがあり、そのカラムにsc_10というのがあります。そのカラム値を書き換えする場合、モデル側とコントローラ側の
どちらにコードを記述するべきなのでしょうか?少々複雑に算出する値なのでコードが長くなってしまうので
出来ればモデルに記述したいのですが、モデル側でランダムな値(id)を取得する方法がわからないのでです。
ランダムな値とは、現在ログイン中の主キーのことになります。
コントローラ側では current_customer.id で現在ログイン中のidを取得出来るのですが、モデル側ではどうやって
現在ログイン中のidを取得するのでしょうか?

実際にはもっと複雑になるのですが簡単に記述しました。
CustomersテーブルとScoresテーブルは1対1の関係にあります。

class Score < ActiveRecord::Base belongs_to :customer bbb = Score.find_by(customer_id: 2) bbb.sc_10 = 1003 bbb.save end

モデル側でScore.find_by(customer_id: 2) のように、ダイレクトに id を指定してやるとscoresテーブルのcustomer_id 2の
レコードのsc_10カラム の値が1003で更新され保存されます。
フォームから送られてきた値で更新したりするのはedit, updateアクションでいいのでしょうが、フォームとは関係ないところで
算出するので算出式をどちらに記述するべきなのかアドバイスをいただけないでしょうか?
モデル側で現在ログイン中のidを取得するにはどうしたらいいのでしょうか?教えてくださるよう宜しくお願いします。

自分の現状は、コントローラにコードが集中して記述されていてモデル側がスカスカの状態です。
もし、よろしければ個人差はあると思いますが、モデル側にはどんな内容を記述しているのかも教えていただければ
今後の参考にさせていただきますのでお願いします。

bbb = Score.find_by(customer_id: current_customer.id)とモデル側に記述するとエラーになってしまいます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

モデル側では「ログインしている」という状態は考えてはいけません。
ログインしているかどうかはコントローラが判断する事です。
コントローラ以外では、ログイン中かどうかは分からないと考えてください。
そして、モデルではログイン中かどうかは関係ありません。
ログインした結果、current_customerのidが1とか2などに確定するだけだからです。
従って、モデル側のメソッドは単に受け取ったidに対して処理を行う記述をすれば良いです。

また、変数名はサンプルであってもbbbなど分かりづらいものは避けてください。
分かりやすい名前を付けるのもプログラムの作業の1つです。

とりあえず、私ならこう書きます。
元のコードではsc_10を1003固定で更新していますが、将来的に別の値で更新したいという話になりそうなので、デフォルト値を1003として、任意で値を渡せるようにしました。

ruby

1class Score < ActiveRecord::Base 2 belongs_to :customer 3 4 # customer = Customer.find(1) 5 # Score.update_sc10(customer_id: customer.id) 6 # Score.update_sc10(customer_id: customer.id, value: 500) 7 def self.update_sc10(customer_id:, value: 1003) 8 score = self.find_by(customer_id: customer_id) 9 unless score 10 raise "score not found: customer_id=#{customer_id}" 11 end 12 score.sc_10 = value.to_i 13 score.save! 14 end 15end

コントローラでは上記のメソッドを呼ぶだけです。

ruby

1class ScoresControlller < ApplicationController 2 3 def update 4 # 通常 5 Score.update_sc10(customer_id: current_customer.id) 6 7 # 1003以外の値で更新したい場合 8 # Score.update_sc10(customer_id: current_customer.id, value: 500) 9 end 10 11end

投稿2017/10/23 08:30

mingos

総合スコア4025

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

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

koume

2017/10/23 08:42

回答ありがとうございます。参考にさせていただきます大変勉強になりました。 今後とも宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問