xengineer’s diary

結果、メモ的な内容になっています。

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に変数渡したいゴン

はい、表題の通りだゴン。

そしてそれを実現してくれるのが、こちら!

github.com

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しようとしました。

f:id:xengineer:20150606202436p:plain

撃沈・・・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