アソシエーションをeachするとundefined method `each' forとエラーがでる
以下のようなアソシエーションがあります。
MysQlで結果のような出力をするためには以下の内容になります。
SELECT users
.* FROM users
INNER JOIN facilities
ON facilities
.id
= users
.facility_id
ではRailsではどのように書くのでしょうか? まずはModelから
model
class User < ApplicationRecord
belongs_to :facility
end
class Facility < ApplicationRecord
has_many :users
end
has_manyがつくのは関連付けのidを持っている方につけます。
この場合usersテーブルが、facility_idをもっているので、 has_manyはFacilityモデルに書くということになります。 また、has_manyに関連するモデルは複数形にしてください。
Controller
@user = User.joins(:facility)
.joinをつけることで、INNERJOINが発生します。 Railsのログを見てみましょう。以下のようなSQLが発行されています。
SELECT `users`.* FROM `users` INNER JOIN `facilities` ON `facilities`.`id` = `users`.`facility_id`
では、Excelの結果の出力をView側で再現してみましょう。
View
- @user.each do |user|
%tr
%td= user.facility.email
%td= user.fa_name
これで結果が出力されました。
さて、エラーが出るのはどのようなときでしょうか? 以下のような場合は、eachしてもエラーがでます。
View
- @user.each do |user|
- user.facility.each do |fa|
%tr
%td= fa.facility.email
%td= user.fa_name
なぜかというと「facility」が「belongs_to」だからです。 もし、「facility」が「has_many」であればeachをしてもエラーは出力されません。
Deviseのafter_sign_in_path_forにdestroy_user_session_pathをつけたい
Deviseでログイン時にユーザーにごとにリダイレクト先を分ける設定で、
あるユーザーはログアウトさせたい。ログインさせたくない時。
def after_sign_in_path_for(user)
if current_user.status == 'user'
projects1_path //user先のパス
elsif current_user.status == 'admin'
projects1_path //admin先のパス
else
Devise.sign_out_all_scopes ? sign_out : sign_out(current_user)
root_path //他はログアウトさせる
end
end
ユーザーにstatusというカラムを作って
そこに入るデータはuserかadmin
[user]の場合
current_user.status == 'user'
projects1_path
[admin]の場合
current_user.status == 'admin'
projects1_path
[その他]の場合
Devise.sign_out_all_scopes ? sign_out : sign_out(current_user)
root_path
ログアウト処理をさせるようにしました。
単純にdestroy_user_session_pathにすると、ルートエラーが起きたので
他を調べたらGetにオーバライドするとか書いてあったんですが、
Deleteメソッドを変えたくなかった結果これで無事動きました。
Rails4でdate time pickerのみを使う
CSSのフレームワークは、materializeを採用しました。
materializecss.com
BootStrapもいいんですけどね、でも使うと(あ、こいつBootStrap使ってるな・・・)
すぐにばれちゃうし、たまには別のも使いたいし。ってことで割と使いやすそうなmaterializeを採用しました。
いざdatetimepickerを使おうとしたら、あららBootStrapのdatetimepickerのネタばっかりで
ノーマルなdatetimepickerの情報がない・・・orz
あるとしてもdatepickerの情報ばかりでdatetimepickerが見当たらない。
datepicker...使えるのは日付けだけ
datetimepicker…日付けも時間も使える
こりゃ公式からインストールしてイチからするしかないかな・・・
と思ったらありました!Gemが!
github.com
あ、ありがたや…
(でも日本語のdatetimepickerの検索のひっかかり率低いと思うの・・・
Railsの世界じゃ常識なのかしら・・・)
以下インストール手順
→手順1
Gemファイル
gem 'jquery-datetimepicker-rails'
$ bundle install
→手順2
app/assets/stylesheets/application.css
= require jquery.datetimepicker
→手順3
app/assets/javascripts/application.js
//= require jquery.datetimepicker
$('.datetimepicker').datetimepicker();
Viewのclassに"datetimepicker"とつけたら無事に動きました!
便利だなぁ・・・(しみじみ)
CORDOVAの環境構築
Androidとiosのアプリケーション開発に取り掛かることになりました。
そこで採用になったのがCORDOVAさん!
両方開発できる素晴らしいフレームワークなのです。
しかしいざエミュレーターを立ち上げようと
$ cordova emulate android
waiting for emulator・・・
で止まる。
それもエミュレーターっぽいインターフェイスが一瞬起動するけど
その後は動かない・・・エラーも出ない・・・
AVDから起動してみることにしました。
$ android adv
起動するAndoroidを選択してStartをクリック!
emulator: ERROR: x86 emulation currently requires hardware acceleration!
Please ensure Intel HAXM is properly installed and usable.
CPU acceleration status: HAX kernel module is not installed!
むむむ・・・エラーが発生。
でもちゃんとエラーの内容がでてる!(笑)
どうやらコマンドプロンプトさんの方でエミュレーターを起動してもエラーが出ない模様。
ameblo.jp
参照にさせていただいたところ無事にエミュレーター起動しました。
Biosの設定そういえば新しいPCにしてからしてなかった(テヘペロ☆)
紅玉のアップルパイ
紅玉を母が買ってきてくれたので早速作ってみたかったアップルパイに挑戦しました!
- 紅玉4個
- 砂糖
剥いた紅玉の重さの20%程度
- レモン汁
紅玉1個の半分の重さ
- 市販パイシート
フライパンに皮と紅玉を入れて一緒に煮込みます
一緒に煮込むことでピンクの美味しそうな色合いになりました!
市販のパイシートを半分に切って良い具合に紅玉をのせていきます。
パイシートに切り込みを入れて黄卵を塗ったら
200度のオーブンへGO!
ちょいと焦げ気味になりましたが、サクサクで紅玉の香りと
すっぱさが際立つアップルパイが完成しました!
このすっぱさは市販ではできないので、手作りの醍醐味です。
勿論中身もぎっしり入ってるので、おやつというより主食(?)
でお昼にいただきました。
ごちそうさまでした。
オーブンに入れた時に、どうしてもドロヘドロ20が読みたくて
母にオーブンを任せて本屋へ走った結果、すこし焦げ気味に
なってしまいました…。
しかし、ドロヘドロ読んでると餃子作りたくなりますね。
間違ってもあまりパイを作りたい気分にはならないはず…
ん…あれ?
RoRにBootStrap-sassをインストールする
早速Bootstarap-sassを入れたいと思います。
※私のRoRの構成については以前の記事を参照してください。
①Gemfileに以下の内容を書き込む。
gem 'bootstrap-sass', '~> 3.0'
gem 'sass-rails', '~> 4.0.3'
'~> 3.0'とすることで3.0の最新のバージョンをインストールするように指定しました。
②GemFileをインストール。
$bndle install --path vendor/bundler
この --path vendor/bundler で vendor/bundler の階層にインストールするようにしました。
もしアンインストールしたい時は、/vendor を削除すればOKです。
今後の運用・管理を考えてもぜひGemのインストールの時は --path で指定してください。
③application.scssファイルの作成
app/assets/stylesheets階層の
application.cssを削除して
application.scssを作成してください。
application.scssには以下の内容を記載。
@import "bootstrap-sprockets";
@import "bootstrap";
④application.jsファイルの修正
app/assets/javascript階層の
application.jsに以下の内容を追記してください。
//= require bootstrap-sprockets
追記する場所は//= require jquery下でOKです。
⑤nginxを再起動
無事反映されました(^0^)/
最初、nginxを再起動しなかったので全然反映されなくて??でした。
どうやらgem関係をインストールした時、再起動は必須な模様。
光田康典 THE BRINK OF TIME
最終公演の夜の部に行ってきました!
実を言うとゲーム関係のコンサートは人生で2回目です!
1回目も今年になってからで、内容はFFのコンサートでした!
光田さんのコンサートですが、本当に凄くよかったです!
いや、最終公演ってこともあるんでしょうけど、
これはハマる人の気持ちがわかりますね。
最初の風の憧憬が流れておもわず涙目。
small two of piecesで言葉にならず。
マジカルドリーマーズで涙。
クロノクロスのオープニングテーマで胸がいっぱい。
ゼノギアスのシタン先生が
この曲を聞いて時にはげまされ、時に泣いたりしていたのでしょう。
遠い昔の人たちも、きっと……。
音楽は不思議ですねー。ゲームをやってなくても
その時の気持ちが思い出せるので。
しかし不満があるとすればTシャツが売り切れだったこと…
ですがそれ以上に楽しい時間でした。
コンサートホール小さいなと思いましたが、あれぐらの大きさが
個人的には好きなので※音が近いほうがすき!
とてもよかったです^^♪