Railsの勉強でまとめ記事(Qiita投稿)
最近ブログ更新が滞ってたんだけど、勉強結果のまとめをQiitaに投稿したのでそのことについてグダグダを書いてみる。
学習結果まとめ1
最近勉強ネタ元になっているアプリをウンウン言いながらソースコードリーディングしてる途中に見つけた、素敵実装について書いてみた。
よくある、お問い合わせフォームみたいのの、確認画面を出すところのきれいな実現方法だったのでエッセンスを書き出してみた。
お問い合わせフォームって、入力する内容と、一旦確認画面に出す内容って、ほぼほぼ一緒(そりゃそうだ・・確認なんだから)で、コントローラーもビューもバラバラに書いてしまうと、いわゆるDRYじゃなくなっちゃうな〜と思うんだけど、それをRailsのvalidation や afterコールバックをうまく使って綺麗に書く方法について。
ココで使われていた validates_acceptance_of
なんて、存在も知らんかったくらいなので、大変勉強になった。
ぐぐっても validates_acceptance_of は地味なのか、ちょっと古めの記事しかヒットせず。
Tips的に、この無名ブログよりQiitaのほうが相応しかろう!と思ってそっちに書いてみたら、1日で自分史上最高のストック数になり、ちょっとビビる。。 今までって、ブログやらQiitaに書いたことって、自分でかってに掘った穴に落ちて、もがいて・・やっと出れた〜ってのを書くことばっかりだったので、たまたま見つけた人様の素敵実装をまとめたら、どんどこストックされると・・なんかじんわりと罪悪感が・・・
でもこのストックスピードって、みんな「これは素敵実装!」って思うってことなんだろうな。 うーんさすが。
学習結果まとめ2
最近のRail勉強のおかげで、なんだかRails routesと仲良くなってきたような気がする。
ビューで routing path を使いたい時に、いつもノートを何ページも戻って見直してた自分的忘備録をQiitaに書いてみた。
やっぱ Rails Best Practices はすごいな〜
Rails で JavaScript 管理をbowerにしてから、method: :delete が効かなくなって devise sign_out できなくなった
前回の記事で無事 bower 管理で上手くいっていると思っていたけど・・
前段階: RailsアプリのJS外部ライブラリをbower管理にして、CircleCIがFailして泣きそうになった件・・ - まりぴよこのブログ
devise で sign_out できない!
No route matches [GET] "/users/sign_out"
コレが発生。 以前は普通にサインアウト出来てた様な・・
いつの間にかサインアウトできない仕様にしてしまっていた;;
devise sign_outできないで検索するとこんな感じ・・
・・・まさしく・・なんだが、GETにする対応で良いのだろうか・・・ 普通に今までDELETE送れてたのに・・なんかこの対応じゃダメな気がする・・
解決の糸口
ちょっと古めの記事ですが、コレが解決の糸口に!
JavaScriptを読み込むようにしたところ、以前のままで正常に動作するようになりました。
まさにコレじゃね!? 身に覚えあり・・・
app/aseets/javascripts/applicaton.js
読み込んでるjsはこんな状態だった。
//= require jquery //= require bootstrap-tagsinput //= require_tree .
最初に合ったやつから、 require jquery-ujs
が消えてる(というか消した記憶あり)
bootstra-taginputをBowerfileに入れたら、自動でjqueryがそっちに入ったので、 application.jsをいじくって、その時一緒に消した気がする・・
戻します!
//= require jquery //= jquery-ujs //= require bootstrap-tagsinput //= require_tree .
そんなファイルないので取り込めません!(そりゃそうだ)
Bowerfileに入れます!
asset 'bootstrap-tagsinput' asset 'jquery-ujs'
インストール!
$ ./bin/rake bower:install
asset pipeline を確認
$ ./bin/rails c > Rails.application.config.assets.paths
その他参考になったサイト
jquery-ujs
のハイフンをアンダースコアにしていて、インストール後にまだjs読み込めん!となったため、下記サイトのお世話に・・
RailsアプリのJS外部ライブラリをbower管理にして、CircleCIがFailして泣きそうになった件・・
久しぶりのブログ更新・・
最近がんばってRailsのアプリ課題を進めているので、ブログの更新が滞っています・・
途中見つけたTipsはQiitaに書いてるんだけど、今回のはまだ生煮えなのでブログの方に書いてみる。。
bower で JS のライブラリ管理
Railsのプロジェクトで、jsライブラリいれよ〜と思った時、zip ダウンロードして vendor/assets
に手動コピー、展開・・って流れがイヤだな〜と思って、以前調べていた手順書を元に、Railsプロジェクト内のJSをbower管理にしてみた。
↓自らの軌跡が役立って嬉しい・・
Bowerfileこんな感じ
asset 'bootstrap-tagsinput'
bootstrap で良い感じにタグをスタイルしてくれるライブラリを入れてみた。
こいつと一緒にjQueryも vendor/assets
の方に入ったので、邪魔になるといかんと思いgemで入ってた方のjqueryを消す。
Gemfileこんな感じ
- gem 'jquery-rails' # こっち消した + gem 'bower-rails' # こっち追加した
これで bundle update
と ./bin/rails g bower_rails:initialize
で初期設定完了。
ローカルでは動いた・・問題はそのあと・・
ここまでは特にハマりポイントもなく、順調に進む。 (10ヶ月くらい前の自分が一度ハマった沼だからね・・)
ローカルでは動作したので、githubにプッシュ!
・・・したらCircleCIがコケた;;
うわぁん。。(そう、前回はgithub + CircleCIまでやってません)
こんなエラー
$ bundle exec rake assets:precompile rake aborted! Sprockets::FileNotFound: couldn't find file 'jquery' with type 'application/javascript' /home/ubuntu/micro-sof/app/assets/javascripts/application.js:3
jQueryないって・・・いわれてる気がする・・・
circle.ymlの設定??
(結局関係なかった)
vendor/assets/bower_components
以下のファイルをリポジトリに突っ込んでなかったので、CircleCIでもnpmやらbowerやらの動作が必要なのでは・・・?と考え、インストールしてくれるであろう設定を付け加えてみた。。
付け足したのはpreのとこ。
circle.yml
dependencies: pre: - npm install & npm install bower -g post: - bundle exec rake assets:precompile
しかし、解決せず;;
(ここまで関係なかったとこ)
解決策
ふと思い立って、 bower がインストールできなくても、 bower_components
の読み込み終わってれば jQuery あるんじゃ・・?と
.gitignoreに付け加えてた、 bower_components 以下無視を削除して、大量のファイル達もコミット!
したら動きました・・・
node_componentsとか、それ系の「ダウンロード&インストールするだけ」のファイルは、git commitしない、ってうろ覚えてた記憶があるんだが・・・・
bower_components はコミットしといた方がいいのかな・・・?
とりあえず、解決!
この辺の疑問点とかもスッキリわかったら、Qiitaにちゃんとした記事書こっと。
追記(2016/04/05)
やっぱりcircle.ymlの指定だけで解決できた・・・
半年後別のプロジェクトで同じ問題にぶち当たる。 ローカル環境では動くけど、CircleCI上で動かすとテストがコケる;;
Failure/Error: #= require bootstrap-sass/assets/javascripts/bootstrap/alert ActionView::Template::Error: couldn't find file 'bootstrap-sass/assets/javascripts/bootstrap/alert' with type 'application/javascript'
このプロジェクトもbowerでjs系のライブラリを入れてて、 bootstrap/sass
がないよってエラー
circle.ymlに
test: pre: - bower install
を追記したら普通にインストールしてくれた・・・
参考: Deploying Grunt and Bower from CircleCI to Heroku with Node.js | Sebastiaan Deckers
Railsでネストしたモデルの link_to method: :delete と form_for する方法
ネストしたモデル
- blog has_meny entries
- entry belongs_to blog
の状態で、entryを削除したい。
link_to :delete
(hamlです)
before
= link_to 'Destroy', entry, method: :delete, data: { confirm: 'Are you sure?' }
after
= link_to 'Destroy', [ @blog, entry ], method: :delete, data: { confirm: 'Are you sure?' }
参考
form_for
before
= form_for(@entry) do |f|
after
= form_for [@blog, @entry] do |f|
参考
どっちも配列で渡せばいい。
つながるWeb services
すごい・・世界はつながっている・・・!!!
何にどのくらい時間がかかっているのか、調べてみてる
毎度毎度見積もりと実測が激しくズレるので、最近真面目に時間を気にしてみている。。
そして使い出したのがToggle
作業項目を記入して、スタートボタンをクリックするだけ! (なぜか家のMaxで作業項目を入力すると、自動でタイマースタートする。会社のWinだとスタートボタンクリックまで待っている)
同じChromeなんだけど、微妙に動作が違う・・ 家のに慣れてしまうと、うっかりスタートボタン押し忘れるミスが頻発して悲しいことになる;;
ここ最近のワークフロー
会社のタスク管理はTrelloなんですが、ここんとこの自分のワークフローが
- Trelloでカード、チェックリスト作る
- 作業開始と共にToggleでタイマー開始
- 作業終了でToggleのタイマー終了
- Trelloのタスクをチェックする
だったんですが・・・
ちょいちょいToggleし忘れる・・
あと、Toggleったまま席を立ったり、帰っちゃったりする・・ (帰っちゃうと、Toggleが何時間もタイマーつけっぱ~だよ。とメールで教えてくれる。めっちゃ親切♪)
繋がった・・・!
Toggleの隅っこにちょいちょいお知らせが出てるんですね。。
Toggle画面の右端下に時々お知らせが出てる(あとプロ版使ってみない?とか)
なんか見慣れた文字が・・Trelloと連携すんの??
ポチると、Chrome extensionページに飛ばされる。。
言われるがままにインストールしてみたが、Chrome拡張の位置に赤いボタンが増えただけ・・あれ??と思ってたんですが。。
コレこのままボタン押すと、普通にタイマーが起動するだけ・・ (作業項目は「Chrome」ってなってる。。)
Trello連携なんだから、Trello見なさい!
Trello画面の方を更新してみたら・・ボタン増えてた!!(驚愕)
ボタン押すと、赤くなってタイマー開始! すげ~~ すげ~~~~
もちろんクリックしたタスクがタイマーの項目になります(当たり前 ww)
最近の大好き3サービスが繋がった
新しいワークフローは
- 作業開始:TrelloでToggleボタンクリック
- 作業終了:Trelloでチェックリストをチェック(complete)
- Slack連携で勝手にプロジェクトのルームにお知らせが通知される
おおお。。
なんか・・自分なんにもやってないのに、ハンパない達成感・・ ww
いつかやってみたい・・
Chrome extensionページで、色んな連携プロジェクトのアイコンが表示されてて、すげ~すげ~と思った。。 よくよく見るとちゃっかりesaもいるやん!すごいな!
なぜこんな不思議なことが・・と思ったんだけど・・
連携したいサービスの人たちがプルリク送って拡張してってるんだ・・
すごい・・すごいな・・世界は広いな・・
HomebrewでMySQLのセットアップ
自分の作業履歴・・
インストール
brew install mysql
非力なairでmakeが恐ろしく時間かかる;;
自動起動設定
macのcronみたいの。
ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
ざっくりと。。
- ユーザー用のlaunchd設定ファイル置き場に、brewがダウンロードしてきてくれた launchd設定ファイルを置く。(*.plist)
- launchctlコマンドでmysql用の設定ファイルをロードする
MySQL初期設定
ROOTパスワードの設定など。 mysql_secure_installation
を使う。
$ mysql_secure_installation Set root password? => N Remove anonymous users? => Y Disallow root login remotely? => Y Remove test database and access to it? => Y Reload privilege tables now? => Y
- ルートパスワードを設定するか? => 今回はNo (ローカル環境のテスト用なので)
- アノニマスユーザーを削除するか? => 削除する
- rootユーザーのリモートログインの禁止するか? => 禁止する
- テストデーターベースの削除するか? => 削除する
- 権限の変更を再読み込みするか? => 再読み込みする
接続出来るか確認
$ mysql -u root mysql > show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.00 sec) mysql > exit
よさげ。
Ruby エラトステネスのふるいで学ぶArrayの便利メソッド
素数を求めるアルゴリズム
手順
- 探索リストに2からxまでの整数を昇順で入れる
- 探索リストの先頭の数を素数リストに移動し、その倍数を探索リストから篩い落とす
- 上記の篩い落とし操作を探索リストの先頭値がxの平方根に達するまで行う
- 探索リストに残った数を素数リストに移動して処理終了
Wikipediaのふるってるanim gifがかわいい ww
最初の回答
手順をそのまま書いてみた。
STEP2の倍数をふるい落とすところ、ごちゃごちゃしたので関数に切り出している。
削除する数値を一端リストとして作成している deleting_numbers
class Eratos def self.eratos(max) list = (2..max).to_a prime_check_max = Math.sqrt(max) prime_list = [] begin target = list.shift list = sweep(target, list) prime_list << target end while target < prime_check_max list.count > 0 ? prime_list.concat(list) : prime_list end def self.sweep(target, numbers) max = numbers.last / target deleting_numbers = (1..max).map { |n| n * target } numbers.reject { |n| deleting_numbers.include?(n) } end end
なんか無駄にごちゃごちゃしておる・・
Array.select
ブロックが真を返す要素からなる配列を作成。
例:2で割り切れる数のみ抽出
arr = [ 1, 2, 3, 4, 5 ] arr.select { |n| n % 2 == 0 } # => [ 2, 4 ]
Array.reject
selectの逆
ブロックが偽を返す要素からなる配列を作成。
例:2で割り切れない数のみ抽出
arr = [ 1, 2, 3, 4, 5 ] arr.reject { |n| n % 2 == 0 } # => [ 1, 3, 5 ]
Array.delete_if
ブロックの戻り値が真になった要素を削除
元の配列を操作する
arr = [ 1, 2, 3, 4, 5 ] arr.delete_if { |n| n % 2 == 0 } puts arr # => [ 1, 3, 5 ]
select の逆版 reject を発見してなんか嬉しい♪
もっとすっきり
STEP2の倍数をふるい落とすところ、一端削除する数値のリストを生成してるけど、要するに割り切れる場合はふるい落としてよいことに気づく。
def self.eratos(max) list = (2..max).to_a prime_check_max = Math.sqrt(max) prime_list = [] begin target = list.shift prime_list << target list.delete_if { |n| (n % target).zero? } end while target < prime_check_max list.count > 0 ? prime_list.concat(list) : prime_list end
delete_ifで破壊的に配列を操作。
結局 sweep
部分は1行になったので、関数に分割するのやめた。