railsで、view毎に読み込むjsを変えたいんだよね
railsのasset pipelineはとっても便利なんだけど、開発も進んできて、
jsファイルが増えてくると、色々管理が大変になるのよね。
違うview同士で同じcssのclass使ってたりして、「あれー?なんか謎のjsが動いている、、、」
みたいなことになります。(なりました) どうすればいいのか、、、
単純な僕は、
require tree削除して、viewごとにlayout切って、必要なjsを読み込ませたりしました。
で、プルリだしたら、「content_for使えカス」と一蹴されたので、調べてみました。
すると、、、content_for便利ね!view内のyieldに、同じviewの中から任意文字列渡せるんだけど、
これがとても便利。
まぁ例でみるほうが早いので、以下でどうぞ。
まずは、asset pipelineで読み込まないjsを読み込むように設定しないといけない。(んだと思う)
config/initializers/assets.rbに下記記載。ファイルなければ作りましょう。
Rails.application.config.assets.precompile += %w( project.js )
app/view/layout/application.html.hamlに★の行を追記。
1 !!! 2 / 3 This is a starter template page. Use this page to start your new project from 4 scratch. This page gets rid of all links and provides the needed markup only. 5 %html 6 %head 7 %meta{:charset => "UTF-8"}/ 8 %title Oniwa | Dashboard 9 = include_gon 10 = yield :javascript★ 11 12 = stylesheet_link_tag 'application', media: 'all' 13 = javascript_include_tag 'application' 14 = csrf_meta_tags
描画時に、この★印のyieldのところに、javascript_include_tagが入るわけです。
で、↓↓↓の記述で、読み込むjsファイルを指定するわけです。
app/view/projects/show.html.hamlの(jsを読み込ませたいviewの)行末に下記を追記。
146 147 - content_for(:javascript) do 148 = javascript_include_tag 'project'
沢山読み込ませたいときは、続けて沢山かいて大丈夫。
これで、このviewで読み込まれるのは、app/asset/javascript/application.jsに書かれてるjsと、
content_forで書いてある、project.js(app/asset/javascript/project.js.coffeescript)になります。
いやはや便利。cssでも使えるよ。
railsで、2つのDateの間の月をarrayにする方法
一定範囲の日付間にある月をarrayにしたい事案が発生しましたわけです。
[1] pry(main)> startday=Date.today-180 => Fri, 12 Dec 2014 [2] pry(main)> endday=Date.today => Wed, 10 Jun 2015 [3] pry(main)> (startday..endday).select {|day| day.day == 1} => [Thu, 01 Jan 2015, Sun, 01 Feb 2015, Sun, 01 Mar 2015, Wed, 01 Apr 2015, Fri, 01 May 2015, Mon, 01 Jun 2015]
こんな感じででけたーよ。
railsで、controllerから直接javascriptに変数渡したいゴン
はい、表題の通りだゴン。
そしてそれを実現してくれるのが、こちら!
gonです。
↓の記事と同じことを書くだけになりますが・・・
gonを使ったRailsとJavascriptの連携について - Qiita
やることは、下記の流れ。
- gem 追加 and install
- application.html.hamlにinclude gon追加
- controllerに変数記述
- js側で利用
gem 追加 and install
Gemfileに下記追記。
gem 'gon'
からの、bundle install
$ bundle install
application.html.hamlにinclude gon追加
app/view/layout/application.html.hamlに下記追記。
%html %head %title Title of page = include_gon★ = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true = javascript_include_tag 'application', 'data-turbolinks-track' => true ... ...
controllerに変数記述
僕は、ajaxで使うURLを渡したかったので、controllerにこんな感じに追記。
gon.url = organization_path(@organization)
js側で利用
js側でも同じ変数名で呼び出せるので、特にひねりなく呼び出します。
GETURL = gon.url + '/unko_yobidashi/'
ざっくりこんな感じ。
railsでmigrationのversionだけがconflictしてるとき
はい、そんなときにどうしてるかメモです。
git でLGTMもらったので、意気揚々とmergeしようとしました。
撃沈・・・rebaseします。
$ git fetch origin $ git rebase origin/master ... ... 13 14 <<<<<<< HEAD 15 ActiveRecord::Schema.define(version: 20150530030714) do 16 ======= 17 ActiveRecord::Schema.define(version: 20150530152930) do 18 >>>>>>> Added due_date column to order_sets table. 19 ... ...
そんな大したこともなく、migrationのversionだけぽい。 でもどっち残せばいいんだっけ? こんなときにも、↓↓の記事のコマンドが使えます。 railsのmigration状況を確認する - xengineer’s diary
$ rake db:migrate:status database: /Users/xxxxxxx/yyyyyy/db/development.sqlite3 Status Migration ID Migration Name -------------------------------------------------- up 20140601010547 Devise create users down 20150530030714 Add abc to users up 20150530152930 Add def to users
ま、当然新しいほう適用すればいいんですけど。 確認しないと心配なときはこれが使えます。
一件落着。
railsのmigration状況を確認する
railsで、dbをロールバックしたいときに、よく、現状どうなってんだっけ? と思うので、そんなときに使ってるコマンド。
$ rake db:migrate:status database: /Users/xxxxxxx/yyyyyyy/db/development.sqlite3 Status Migration ID Migration Name -------------------------------------------------- up 20140601010547 Devise create users up 20140601094433 Add name to users up 20150510130754 Add attachment image to users up 20150530030714 ********** NO FILE ********** down 20150530152930 Add due date to xxxxxx
ん?NO FILEってなんだろう? と、最初思ったんだけど、これはどうやら他のbranchであてたmigration fileで、 今別branchにいるので、NO FILEってことらしい。 なるほど。
では今回は、2個前に戻りたいので、↓↓で書いたとおりのコマンドを実行してみる。
rails db:rollbackでDatabaseをロールバックする - xengineer’s diary
$ rake db:rollback STEP=2 $ rake db:migrate:status database: /Users/xxxxxxx/yyyyyyy/db/development.sqlite3 Status Migration ID Migration Name -------------------------------------------------- up 20140601010547 Devise create users up 20140601094433 Add name to users up 20150510130754 Add attachment image to users up 20150530030714 ********** NO FILE ********** down 20150530152930 Add due date to xxxxxx
あれ?全然変わってない・・・ ぬぐぐ・・・じゃあmigrationファイル書き直して、 ↓↓で書いたみたいに、最初から migrationし直してしまおう・・・
db:migrateを最初からやり直したい! - xengineer’s diary
$ rake db:migrate:reset $ rake db:migrate:status database: /Users/xxxxxxx/yyyyyyy/db/development.sqlite3 Status Migration ID Migration Name -------------------------------------------------- up 20140601010547 Devise create users up 20140601094433 Add name to users up 20150510130754 Add attachment image to users up 20150530152930 Add due date to xxxxxx
おー。よしよし。NO FILE消えたし、ちゃんとあたってる。 そして、db/schema.rbも更新されてるのでよさげ。
タイトルの趣旨とは違うところまできてしまったけども、よいでしょう。
db:migrateを最初からやり直したい!
いつも通り、migrationファイルを作って、カラム追加しようとしたら、 こんなエラーに見舞われてしまった。
== 20150530030714 AddDueDateToOrders: migrating =============================== -- add_column(:orders, :due_date, :date) rake aborted! StandardError: An error has occurred, this and all later migrations canceled: SQLite3::SQLException: duplicate column name: due_date: ALTER TABLE "orders" ADD "due_date" date/Users/nemoto_hideaki/work/root4/branch/*******/db/migrate/20150530030714_add_due_date_to_orders.rb:3:in `change' -e:1:in `<main>' ActiveRecord::StatementInvalid: SQLite3::SQLException: duplicate column name: due_date: ALTER TABLE "orders" ADD "due_date" date /Users/nemoto_hideaki/work/root4/branch/*******/db/migrate/20150530030714_add_due_date_to_orders.rb:3:in `change' -e:1:in `<main>' SQLite3::SQLException: duplicate column name: due_date /Users/nemoto_hideaki/work/root4/branch/*******/db/migrate/20150530030714_add_due_date_to_orders.rb:3:in `change' -e:1:in `<main>' Tasks: TOP => db:migrate (See full trace by running task with --trace)
duplicate column name・・・schema.rb見る限り同じカラムないんだけどな・・・ 何回やっても同じなので(当たり前)、最初から migration しなおしてみた。 いつもコマンド忘れるのでメモ。
$ rake db:migrate:reset $ rake db:reset
ちなみに、
- rake db:migrate:reset
- db/migrate/*.rb を古い順にあててくれるらしい
- rake db:reset
- db/schema.rb でdbを再構築してくれるらしい
今回は、schema.rb に追加したいカラムが入ってないので、rake db:migrate:resetを使いました。 で、成功したとさ。ちゃんちゃん。
↓の方の記事をオマージュ。 rake db:reset と rake db:migrate:reset の違い | EasyRamble