白ヒゲさんののんびり blog

プログラミング初学者が書く。間違い探しブログです。勉強中はRuby on Railsです。

【rails】 前回実装した検索機能を改善した件!

こんにちは、白ヒゲさんです(*´∇`*)

 

今回は前回実装した複数モデルからの検索機能の実装の改善です!!

詳しくは下の記事を参照にしてください♪

【rails】 ransackを使わずに複数モデルから値を取得する!! - 白ヒゲさんののんびり blog

 

と言うことでどこを改善していくのか?

改善というよりそもそも欠陥コードなんですよね_:(´ཀ`」 ∠):

 

それでは、今回改善する問題点はこれです!!

・tagがついていないと曖昧検索どころか検索できない。

・tag_nameとblog_titleが重複してしまうと同じ奴でも構わず複数個表示してしまう。

 

この2点を改善していきます。

 

まずは現状のコードを確認していきます。

今回の争点になる部分はmodel内のみなのでmodelないのみ表示していきます。

(controllerは前回のを参照してくださいね)

 

<blog_model>

f:id:t_custom8:20201122151317p:plain

 

f:id:t_custom8:20201122151114p:plain

注目するべきは全てif @tag.present?内にあります。

 

一点目のtag_name無しでも検索できるようにする問題を解決していきます。

邪魔だったのが、if @tag.present?ですね。

良かれと思って作成した条件分岐がアダとなってtag配列が存在しない場合に何も表示しない状態になってました。

なのでこの条件分岐を削除して中身のみ残します。

 

これで怪傑ゾロリです。

 

それでは、二点目の問題点を解決していきます!

これは、最後の@blogのところにuniqメソッドを追加します。

uniqメソッドは重複している配列内の要素を取り除いて新しい配列を返してくれるので便利です。

 

これで二点目も解決ゾロリです(*´∇`*)

 

最終的には先ほどのコードがこのような感じに変化します!

f:id:t_custom8:20201122152053p:plain

 

これでどこからでも曖昧検索が可能になりましたd(^_^o)

書いてみるとこれだけなのですが、かなり苦戦しました...でも動いてくれると嬉しいですね!

 

それでは、今回も最後まで見てくださいましてありがとうございました。

【rails】 ransackを使わずに複数モデルから値を取得する!!

こんにちは白ヒゲさんです(*´∇`*)

 

今回は前回で作成したtag編集機能の続きになります。

 

<検索機能の実装>

 

折角、tagを付けたり編集できたりできるようになりました。

tagを付けたと言うことはもちろん検索ができるようにするためですよね??

 

なので検索機能を実装していきたいと思いますd(^_^o)

 

<今回の検索対象と実装内容>

・検索対象はブログ記事のtitleとそれに付随するタグのtag_nameです。

・ブログ記事はBlogモデル。tag_nameはTagモデルと別々のモデルとなります。

・この検索をselectboxなどを使用せずに同一のtext_field内で完結させます。

・今回は投稿者は対象外ですが実装は似たような感じで行けると考えます。

 

それではやっていきましょう!!

 

検索内容の記述はblogコントローラーとモデルへ記述しています。

 

<blogs_controller>

f:id:t_custom8:20201119163758p:plain

ここではsearchで検索してきて@blogs配列がnil出なければ配列を展開していきます。

(viewの記述は省略します)

そして@blogs配列がnilだと何も表示されないように条件分岐しています。

 

<blog_model>

f:id:t_custom8:20201119164042p:plain

コントローラーで記述していたsearchの中身をモデル内に記述していきます。

確か記述の理由が、データのやりとりをするのがモデルだからなのとコントローラーの可読性を上げるためです(違ったら教えてください😃)

それでは、中身の説明をしていきます!

・@tagと@blogは検索内容がヒットしたらそれぞれのモデルから当てはまるものを持ってきます。

 

・@blogの分はブログ記事を展開するところでそのまま使用できるので良いんですが、

@tagは変換して付随しているblog_idを持ってくることにしました。(ここも他に良い方法があれば教えてきただきたいです)

 

・それが<if @tag.present?>による条件分岐です。

 

<blogtags = BlogTag.where(tag_id: @tag.ids)>

・まずはblogとtagテーブルを結ぶ中間テーブルblogtagから@tag_idsと紐づいているblogtagを抽出します。

 

<blogtag = blogtags.pluck(:blog_id)>

・pluckでblogtags配列からblog_idを抽出します。

 

<blog = Blog.were(id: blogtag)>

・この時blogtagはidのみなのでBlogモデルから同じidのものを検索してきます。

 

これで@tagが付随するblog記事を抽出することに成功しました(*´∇`*)

後は<@blog += blog>で@blogへ挿入してあげると完成です。

 

コードにすると凄く短いですが条件などを捻り出すのにかなり時間がかかりました_:(´ཀ`」 ∠):

ですが、検索機能自体は絶対に必要だとは思うので有意義だったと思います!

今後は可読性を上げていかねば思いますd(^_^o)

 

もし誰かのヒントになれば幸いです。

 

それでは、今回も最後までありがとうございました⭐︎

 

 

 

【rails】投稿記事につけたタグを編集する

皆さん今日わ白ヒゲさんです(*´∇`*)

 

今日は前回実装した投稿記事にタグを取り付ける機能の続編になります。

 

そうです!タグを追加したり編集したりするupdateですd(^_^o)

 

⭐︎前回までの設定してあることの復習⭐︎

・投稿記事はBlog,タグはTagテーブルで管理。

・中間テーブル(BlogTagsで多対多の関係を成立)。

・Formオブジェクトを使用して一括でcreate。

 

こんな感じですね(^-^)

 

それではupdateを作成していきましょう!!

 

・僕の考えた最強のupdate: 既存のTag,BlogTagを上書きして行う。

 

まぁ、基本だと思うんですがかなり難航しました...

 

↓↓そして今回出した結論はコチラ↓↓

 

・僕の作ったupdate: 既存のBlogを削除して作成し直す。

 

はい。ということで一度既存のものを削除しちゃうのでちょっとリスクが高いような気がしますが完成したものがこれになります(*´∇`*)

 

<blogs_controller>

f:id:t_custom8:20201112141313p:plain

内容的には簡単です。

@blogを削除してからFormオブジェクトを利用して@blogを作成し直します。

createアクションとdestroyアクションを同時に行う感じですねd(^_^o)

 

若干不安なのですが、これで今回は解決とします♪

 

どうしてもうまく行かなかった理想のupdateも載せますので何かご意見があれば教えていただけると幸いです( ;  ; )

 

<blogs_controller>

f:id:t_custom8:20201112141719p:plain

 

<blogs_controllerのprivate>

f:id:t_custom8:20201112141733p:plain

現在の@blogについているtagをpluckで取り出して新しいtagと置き換えます。

そしてnew_tag_arryという配列の中にtagをsplitメソッドで分解して代入します。

eachメソッドで@tagを生成してそれを中間テーブルに保存しようとしましたが@tags.idがついているはずなんですがidが定義されていないことになりました....

 

なので止むを得ず断念しましたが...なんだかスッキリしませんね。

また、進めて余裕がある時に改良していきたいと思います。

 

それでは、今回も最後まで見てくださった方々ありがとうございました!!

rails 投稿記事にタグをつける機能を実装する。

皆さん、こんにちは(*´∇`*)

 

Ruby on Railsで投稿記事にタグをつけることに悶絶していた白ヒゲさんです。

いや、もう一週間くらいかかりましたwww

 

実際問題としては、acts-as-taggable-on  を使用するのが一般的とのことでした....

 

ですが、私はformオブジェクトを利用して実装することにしました_:(´ཀ`」 ∠):

これが地獄の始まりでしたが、少し感覚が掴めました!!

 

では、忘れない様に解説していきましょう♪

 

今回使用するのは簡単に要約すると

1.ブログ投稿用  >> blogscontroller

2.タグ実装用     >> tagmodel

3.中間テーブル >> blogtagsmodel

4.全てを同時に登録するformオブジェクト

この4種類になります(*´∇`*)(細かい設計は省きますのでご了承くださいw)

 

もうmigrationファイルとmodelのvalidationなんかも割愛します!

tagに一意性を持たせて使い回すために最初は下図の様にしていました。

f:id:t_custom8:20201108010251p:plain

ですが、後でfirst_or_initializeで一意性を確保するので不要です。

 

1:肝心要のformオブジェクト(blog_tags)

f:id:t_custom8:20201108011152p:plain

 

attr_accessorで使用したいカラム名をセットします。

そしてsave内でblog,tag,blogtagのデータを一気に保存できる様に設定します。

 

※今回はタグがメインなのでタグに注目します。

f:id:t_custom8:20201108011723p:plain

f.text_fieldからタグをtag_idsとしてparamsで送信します。

tag_idsの中身をsplitメソッドを使用してバラバラにしていきます。

1.tag_list = tag_ids.split(",")

これでtag_ids内の文字列を『,』の箇所で区切って単語に分けて配列内に入れていきます。※splitすると配列内に分解した文字列が収納されます。

 

2.tag_list.each do |tag_name|

each文を使用してタグを生成していきます。

@tag = Tag.where(tag_name: tag_name).first_or_initializeで新規タグか既存タグかの判別をします。

判別をして既存タグなら既存のidを使用。新規ならidを生成します。

 

 

2:blogコントローラーでparamsとcreateアクションを

ここではformオブジェクトであるblogtagsからのデータをparamsで受け取る様に設定します。それ以外は特に通常と変えていません。

f:id:t_custom8:20201108010652p:plain

 

blogtags_paramsの内容です。

f:id:t_custom8:20201108010700p:plain

 

これで後は、出力するための設定は完了しましたd(^_^o)

下図の様なタグが生成できる様になりました♪

f:id:t_custom8:20201108012626p:plain

fromオブジェクト内でどうやってtag_idsを分解してちゃんとidをセットするか?

を考えるのにかなりの時間を費やしましたがかなり勉強になりました。

 

そして何より偉大だと感じたのがbinding.pryですね♪

どこまで正常に処理が行われているかがわかりやすかったのでかなり助かりました(*'▽'*)

ありがとう!binding.pry

 

オマケ(今後活躍予定??). tag-itを導入

タグ付けUIを提供するjQueryプラグイン(プラグインとは?アプリの機能を拡張するソフトウェア)

とりあえず、ホームページからダウンロードして下図の様な感じでセットします。

f:id:t_custom8:20201108004158p:plain

そしてjQuery用のgem 'jquery-ui-rails' を bundle install します。

 

続いて二箇所ファイルを書き換えます。

app/assets/javascripts/application.js

f:id:t_custom8:20201108004719p:plain

app/assets/stylesheets/application.css

f:id:t_custom8:20201108005020p:plain

このtag-itなんですが...恐らく今回の私の実装では機能していないと思われますww

参考程度と今後のバージョンアップの際の備忘録程度だと考えていただけると幸いです。

 

それでは、今回も最後までみてくれた方ありがとうございました♪

何かご意見があればよろしくお願いしますヽ(´▽`)/

ターミナル上で起動した"pry rails"から抜け出せなくなった時の話

みなさん、こんにちは(*´∇`*)

 

最近deviseコントローラーの沼に嵌まり込んでいる白ヒゲさんです...

 

ユーザー編集をしたいのですがどうやってもパスワードが必要とでてしまいます...

users/registrations_controller

f:id:t_custom8:20201031100105p:plain

これが一番重要そうなんですけど...

 

どうしてもパスワードくれと駄々をこねてきます_:(´ཀ`」 ∠):

 

とりあえずparamsの中身を確認したりしないと行けないかな?

と思いターミナル上で確認するために"rails c"でpryコンソールを起動しました。

 

そして、抜けようと思ったその時...

 

f:id:t_custom8:20201031100503p:plain

ctrl+Cを受け付けなくなったので焦りました...( ;  ; )

画面のcdはなんかテンパって押してますww

 

こんなことしてる場合じゃないのに!!

とは思いましたが起きたことは仕方ない(*´ω`*)

 

意外とそのままでしたがシンプルな記述がありました!!

”exit-program"

 

いや、まじで早々に見つかってよかったです(*´∇`*)

 

とりあえず忘れない様にここにメモですね♪

 

それでは、今回もありがとうございました(*´∇`*)

deviseコントローラーの件、もし分かる方いたらヒント下さい_:(´ཀ`」 ∠):

 

VPN接続とはなんだろう!?(自分なりに簡略解説)

こんにちは!白ヒゲさんです(*´∇`*)

 

今日は寝起きにVPNで海外の人が日本のゲームをやっている!と言う単語が降臨しました。

あぁ、VPNね。なるほど理解。

とわかってそうな言葉を口にしてしまいましたが...

 

現在の白ヒゲさんのVPN知識:仮想ネットワーク

 

それでは、VPNについて調べながら自分なりにまとめていきたいと思います!

 

VPNとはVirtual Private Network

インターネット上でプライベートネットワークを拡張する技術、そのネットワークのことだそうです(`・ω・´)

 

とりあえず書いてあるプライベートネットワークが鍵を握りそうですね🧐

 

・プライベートネットワークとは?

組織・家庭内で使われる専用のネットワークです。

 

ネット契約するとIPアドレスが付与されてそれを入力することでネットが使えますよね?

それは外部の方が使用できない専用のアドレス(ルーター等を利用して共有はできます)です。

いつも自分達が家で使っているネット環境、実はプライベートネットワークというわけです。(間違ってたら教えてくださいね(*'▽'*))

 

それでは、VPNについて考えていきましょうd(^_^o)

 

VPNはこのプライベートネットワーク間を専用線で繋がれているかの様な『仮想的に直接的な接続を構築してくれる』物です。

別名:仮想プライベートネットワーク、仮想専用線だそうです。

 

はい、『考えるな!感じろ!』みたいな感じがしてきましたねw

 

さぁ、もっと簡略化していきましょう!

 

A(本拠点)とB(拠点)があったとします。

Aを拠点としてBに専用のルーターを設置することで誰でも利用できるネットワークではなく、AB間でのみ使用できるネットワークが構築できるという感じです。

さらにC・Dとルーターを置いていくとA〜D間で専用のネットワークが作れるという感じです。

 

内容的には他にトンネリング(仮想トンネル)などもありますが省略します。

 

通常生活している中ではそう感じないですが、企業内での機密性や利便性を向上させるのに向いている様です。

 

しかし、個人でVPNを利用することってあるのかな?と考えていたんですが...

 

それがありました!!

 

・セカイVPN

f:id:t_custom8:20201026111310j:plain
VPNサーバー設置国のVPNサーバーに接続することで各国のIPアドレスでインターネットを利用できるサービス。

 

自分の端末から簡単に利用できるみたいですねd(^_^o)

海外限定のサービス・ゲームやネット規制の厳しい所から規制対象のサービスにアクセスしたい方。などの利用や匿名性・安全性の向上などが主な用途の様ですね!

 

今回、冒頭で述べて話とつなげると日本限定のゲームをやりたい海外の人がセカイVPNサーバーを利用しているというお話になりました。

 

漠然とインターネットを使っていてインターネットなんてどれも一緒でしょ??

と思っていましたが、非常に勉強になりました(*'▽'*)

 

自分なりに解釈してかなり簡略化したつもりなので説明不足や間違っている箇所がありましたら指摘していただけると助かります。

 

今回も画像が一切ない中、最後まで読んでくれた方...誠にありがとうございました。

 

学習系ブログとして利用していますがきちんと読みやすい読み物としてバージョンアップしていきたいと思いますので、今後ともよろしくお願いします♪

 

slackでワークスペースを作成しよう!(ほぼ文字だけですがスーパー初心者用)

こんにちは!白ヒゲさんです(*´ω`*)

 

今回はプログラミングスクールを卒業に当たってやはりチームメンバーが欲しい!!

 

ということでスクールで作成したslackのIDを利用してワークスペースを作成しようと思います。

 

初学者の方でLINEくらいしか触ったことないよって方のためにいうと

ワークスペース』 == 『グループチャット』

と考えてもらっても問題ありません。

 

そしてワークスペースを作ったらさらにその中にグループチャットが作成できます。

 

では、早速作成していきます。

 

あっ...IDを作成している状態からになりますのでよろしくお願いします(>_<)

 

<手順>

1 >> 画面左の所の『+』アイコンを押す。ワークスペースを新規作成。

f:id:t_custom8:20201024103731p:plain

 

2>> メールアドレスを送信します。

ワークスペース作成者の方がオーナー権限を持ちますのでそんなの嫌だ!って方はそれっぽい理由をつけて変わってもらいましょう)

f:id:t_custom8:20201024103803p:plain

 

3 >> アドレスに認証パスがくるので入力します。

 

4 >> 次は英語で何言ってるかわからないと思いますが(自分だけ?)

ワークスペースの名前を決める ⇨ NEXT

・その中のチャンネル名を決める(後から増やせるので悩まなくてok) ⇨ NEXT

・招待したい人を入れる(ここもあとで入力でくるので悩まなくてok) ⇨ NEXT

 

これでワークスペースの完成です(*´∇`*)

初手で色々求められるので若干抵抗感ありますがほとんど後から追加できるので心配ご無用です♪(特に英語が苦手な同志諸君/(^o^)\立てよ国民!!)

 

さぁ、ワークスペースは立ちました!!

 

ですが...

 

問題点はまだあります🙃

 

全部英語!!ですね🙃🙃

 

英語苦手な方だとここでソーラ・レイをスタンバイしてしまいそうですが...

 

大丈夫です!!右上アイコンの環境設定から設定変更できます(*´∇`*)

f:id:t_custom8:20201024105004p:plain

 

日本語の画像やんけとか思ってはいけませんw

環境設定の中の『言語&地域』で日本に設定しましょう!!

f:id:t_custom8:20201024105155p:plain

 

ここまできたらあなたの快適なslack生活は目前です(*'▽'*)

後は『詳細設定』で自分好みにカスタマイズしましょう♪

 

今回はとりあえずここまでですが他にも発見したら書いていきますのでよろしくお願いします(*'▽'*)

 

何か間違っていたら教えていただけると助かります!

それでは、最後まで見て頂きありがとうございました!!