ラベル ** PC - Ruby on Rails の投稿を表示しています。 すべての投稿を表示
ラベル ** PC - Ruby on Rails の投稿を表示しています。 すべての投稿を表示

2014年8月22日金曜日

pluckメソッド

 あるカラムのデータを配列として扱うにはpluckが便利だから使え、と言われた。
 複数カラムから2次元的な配列としても取り出せる。flattenすれば1元配列として扱えて、今回はこれを使うかも。

[57] pry(main)> Prize.pluck(:grade, :sales_quantity).first(10)
   (10.2ms)  SELECT "prizes"."grade", "prizes"."sales_quantity" FROM "prizes"
=> [[1, 1], [2, 9], [3, 118], [4, 5961], [5, 99657], [6, 179019], [1, 6], [2, 66], [3, 1719], [4, 48235]]
[58] pry(main)> Prize.pluck(:grade, :sales_quantity).first(10).flatten
   (10.3ms)  SELECT "prizes"."grade", "prizes"."sales_quantity" FROM "prizes"
=> [1, 1, 2, 9, 3, 118, 4, 5961, 5, 99657, 6, 179019, 1, 6, 2, 66, 3, 1719, 4, 48235]
[59] pry(main)> a = Prize.pluck(:grade, :sales_quantity).first(10)
   (10.5ms)  SELECT "prizes"."grade", "prizes"."sales_quantity" FROM "prizes"
=> [[1, 1], [2, 9], [3, 118], [4, 5961], [5, 99657], [6, 179019], [1, 6], [2, 66], [3, 1719], [4, 48235]]
[60] pry(main)> a[1]
=> [2, 9]
[61] pry(main)> a[1][1]
=> 9

zipメソッド

 とりあえずメモだけ。配列を2次元化できる?
 統計とかとるときに使えるかな?
[1] pry(main)> a=[1,2,3]
=> [1, 2, 3]
[2] pry(main)> b=[3,4,5]
=> [3, 4, 5]
[3] pry(main)> c=[5,6,7]
=> [5, 6, 7]
[4] pry(main)> a.zip(b)
=> [[1, 3], [2, 4], [3, 5]]
[5] pry(main)> a.zip(b.zip(c))
=> [[1, [3, 5]], [2, [4, 6]], [3, [5, 7]]]
[6] pry(main)> a.zip(b.zip, c.zip)
=> [[1, [3], [5]], [2, [4], [6]], [3, [5], [7]]]
[7] pry(main)> a.zip(b.zip, c.zip).flatten
=> [1, 3, 5, 2, 4, 6, 3, 5, 7]
[8] pry(main)> a.zip(b.zip, c.zip)
=> [[1, [3], [5]], [2, [4], [6]], [3, [5], [7]]]
[9] pry(main)> a.zip(b.zip.flatten, c.zip)
=> [[1, 3, [5]], [2, 4, [6]], [3, 5, [7]]]
[10] pry(main)> a.zip(b.zip.flatten, c.zip.flatten)
=> [[1, 3, 5], [2, 4, 6], [3, 5, 7]]
[11] pry(main)> d=a.zip(b.zip.flatten, c.zip.flatten)
=> [[1, 3, 5], [2, 4, 6], [3, 5, 7]]
[12] pry(main)> d[1]
=> [2, 4, 6]
[13] pry(main)> d[1][1]
=> 4
[14] pry(main)> d[0][0]
=> 1
[15] pry(main)> d[0][2]
=> 5
[16] pry(main)> d[0][1]
=> 3

2014年8月18日月曜日

cronを実行する

 WEBサービスでバックグラウンドで定期処理をするってのは必ずと言っていいほどあると思いますが、どうやってやんのかなーと。

 Railsにはwheneverという便利なgemがあるようなので、使ってみる。

参考:
Railsアプリのバックグラウンド処理をWheneverを使ってCron化する

2014年8月13日水曜日

Nokogiriでhtmlから必要な情報を切り出す

 Nokogiriっつーhtml/xmlをサイトから切り出してくる便利な超定番gemがあるそうです。

 他人(他のサイト)のふんどし(情報)で相撲をとる(一儲けする)ようなことって大変多くあると思うのですが、これは結構役に立ちそうです。

 まだちょっと試しただけなので、とりあえず参考リンクのメモを。

参考:
Nokogiri を使った Rubyスクレイピング [初心者向けチュートリアル]
Nokogiriで文字化けを防ぐ

2014年8月6日水曜日

spec_helperでrequire

 RSpecとやらを試していますが、deviseとか絡んできてよくわからない。
Factory_Girlが流行ってるぜ〜といろいろなサイトやテキストに書いてあるのでその通りインストールしてみたが、ちょいちょい書かれている設定が全く反映されない。結果としては使うgemをrequireすれば動くようになったんだけど、どこにもそんな説明は書かれていない。
 常識すぎて書いてない?それとも環境がおかしいのか。
require 'factory_girl_rails'
require 'devise'
require 'controller_macros'
include ControllerMacros
RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
  config.include Devise::TestHelpers, :type => :controller
  config.extend ControllerMacros, :type => :controller
<以下略>

 gemはpathが通っているんだけど、moduleはspec_helperと同階層でないと読めない。ディレクトリが違う場合、相対パスで指定してもダメ。同じディレクトリでも、./と指定するとダメ。なんなんだよ。

 1時間ハマった。疲れた。

いろいろ動かない

 設定変えたときとか、gemを追加したときとか、新しく追加したものが機能しないと焦ります。これがしょっちゅうあります。

 結構その多くは、サーバープロセス再起動、ターミナル再起動あたりで改善しているのですが、いつも焦って忘れてしまう。
 今もあるgemをインストールしたあと機能しないので焦りまくっていて、ターミナルの再起動で使えるようになった。

 なんだよちくしょー。

RSpecのテストが辛そう

 以前Railsチュートリアルの始めの方に出てくるテストを少し試して、面倒だなーーーーーーーーという印象が頭にあって、今日パーフェクトRailsを見たらすぐにshoulda-matcherというgemを使え!という展開。あと、factory_girlを使え!と。
 ちょっとハードルが高いとすぐにやる気をなくすので、こういうのがあると大変助かります。ちょっとやってみよう。


2014年8月5日火曜日

production環境での作業

 デプロイ後やローカルでの本番環境のチェックをどうやったらいいかわからなかった。

 アセットファイルのプリコンパイルは以下の通り。
bundle exec rake assets:precompile RAILS_ENV=production

 productionモードでのサーバー起動は以下の通り。
rails s -e production
テキストが終わってないし復習もできていないまま作業することになっちゃって、不安極まりない。
 ここ数日はデプロイ先の環境でアセットパイプライン周辺の問題でうまく表示できず、 あーでもないこーでもないと1人で悶々と思いつく限りのことを試していた。8割は修正できたけど、まだ完璧じゃない。

2014年8月1日金曜日

本番環境で動作確認

 ようやく本番環境(production)が〜なんて話が出てきました。
 デプロイしたらアセットファイルが読み込まれないという問題があって、とりあえずはローカルで本番環境を試しましょうという話に。

 で、どうやんの?
$ rails s -e production
$ rake db:create RAILS_ENV=production
$ rake db:migrate RAILS_ENV=production

参考:
Rails、Rakeコマンドで本番環境(Production)を指定する方法

 さて、今日はこのへんの対応から。

2014年7月29日火曜日

gem Pundit

 Punditはアクセス管理の認可(authorization)を実装するためのgemですが、これを使えと言われて使ったものの、下知識が足らず、Readme見ても簡単簡単と書かれている割にその通りにしてもうまくいかず、なんなんだよ、と。
 最終的に下記のページを参考にしました。この例を見る限りでは、簡単というほど簡単ではないように思うのですが…。
 ちなみにこのサイトの記事は実装までを完全に再現してくれてはいないため、リンク先のgithub上にある実際のコードが一番参考になりました。

参考:

 つれーなー。Rails始めて2ヶ月くらい経つけど、拒絶反応が取れた程度の進捗。本当に自分がふがいない。
 1人で楽しく自由に進めた方がこれに関しては良い気がする。ドットインストールの興味のある講座とか見たいけど、余計なことに時間を使うなとえらい人がキレたりするからな。なんなんだろう。吸収できるものから吸収して、ちょっとは感覚を持つというかちょっとでも自信をつけさせて欲しいよ。

2014年7月24日木曜日

アスペクト比を変えずに画像を縦横長の決まった範囲に収める

 例えば200*200というマスの中に画像を縮小して、且つアスペクト比を変えずに表示させたい。
 需要ありそうだけど、ググってもなかなか見つからない。

 縦か横のどちらかにだけ合わせるのであれば、cssにwidth: autoやらheight: autoやら書けば対応できるみたいだけど、これを縦横から挟むようなcss書いてもうまくいかない。

 とりあえず裏技っぽいのはあったので参考にリンクを張っておこう。

参考:
【図解】CSSだけで画像の縦横比を維持したサムネイルを表示する

 こんなの簡単そうなのにね。いや、きっとすげー簡単なんだよ。職人はきっと当たり前のように使っているんだ。うーむ。
 いろいろなページのソースを見てみよう。

 gemとか使って事前に切り出しとけよ、とかそういう話なんだろうか。
 切り出してRailsで使う方法はこの辺が参考になりそう。必要になったら読もう。

参考:
#374 Image Manipulation

 自分がRailsを質問すべき人が、キレてて質問しづらい。なんだよ。ちくしょー。優しく教えてくれよ。未経験だって言ったじゃないか。

数値を区切りや通貨単位を入れて表示する

 例えば変数priceに10000000.0と入っていたとして、それを10,000,000円と表示させたい場合、下記で対応可能なんですって。
number_to_currency(price, precision: 0, unit: "", format: "%n%u")
その他、整形に使えるヘルパーはたくさんあるようです。以下、参考まで。

参考:
[Ruby on Rails] 数字を整形する便利なViewヘルパー


2014年7月23日水曜日

条件式の左辺と右辺

 評価されるものを左辺に書こうと言われた。ふーん。あまり深く考えていなかった。

 例えば、片方が数値や文字列であれば自然と a == 5 と書けるけど、aとbのように変数同士だとどっちでもいいじゃんという気がする。
 でもaが自分の年齢で、bが評価される年齢だとすると、自分の年は定数的だから b == a と書く。

 こう考えるのがいいのかな。どちらが定数的か。それを右辺にする、と。

if not と unless

 if not(if !条件式)という書き方をしていたら、unlessの方が見やすい場合があると言われた。
 へー、そもそもそんな条件分岐の命令があることを知らなんだ。なんだしら。

 三項演算子とか、いろいろあるのね。
 ひとつの方法を応用するよりは、ちゃんと使い分けた方がすっきりするのかな??

参考:
条件分岐

例外処理

 まだ使ったこと無いけど、例外処理ってのを見かけたのでメモ。

 begin ~ rescue ~ else ~ ensure ~ endなんての使って、コードの処理がうまくできないときにエラーを吐かせるとか別の処理を行わせることができるって。便利そう。

参考:
Ruby on Rails 例外処理 begin

 あのえらい人の冷たい態度に毎日接しているとなかなかの殺意。一ヶ月前は面白そうなこと投げてくれて感謝していたのにね。
 全くの初心者だと言っていたのに、始めから何でも知っているかのように話してくるのやめてほしい。
 プロジェクトに必要な知識を独学で得ることと、プロジェクトの納期を合わせるなんて、普通初心者にできんの?

 まぁ、頑張ろう。頑張らないと逆に鬱憤がたまって殺しかねない!

データをcsvからインポートする

 例えばmodel/item.rbにデータを取り込むスクリプトimportを書いておいて、下記をターミナルで実行すればいいみたい。
rails runner Item.import

 スクリプトは、例えばこんな感じ。指定したcsvファイルからデータを吸い上げています。
require 'csv'
class Item < ActiveRecord::Base
def import
csv = CSV.read("#{Rails.root}/tmp/links.csv", encoding: "cp932")
csv.each do |link|
item = Item.new
item.title = link[1]
item.price = Float(link[2])
item.save
end
end

参考:

 なんだか怒りでわなわなする毎日。あのエライ人とこの先やっていけるんだろうか。8年前に初めて会った時に覚えた感情を思い出してきた。あのときもこんな感じの人だったような気がする。

2014年7月22日火曜日

認証と認可

 WEBサービスではアクセス制御の定石として、認証と認可があるんですって。保育園の話にしか聞こえない。
 これからdeviseとpunditというgemを使ってログイン管理をしようと思っているのですが、その準備段階の知識がそもそもなくて我ながら大丈夫かよ、と。

 ログインできるユーザーかどうか、というだけでなく、ユーザーの中でも権限ランクの違いがあるってあたりですかね。重要なのは。
 難しい言葉を使ってさも説明したかのような雰囲気出すの嫌いです。

 とりあえずこの辺を読んでわかったふりをしておこう。

参考:
第2章 アクセス制御 アクセス認可

数値と文字列の配列の論理演算がしたい

 例えば・・・
[15] pry(main)> a=[1,2,3]
=> [1, 2, 3]
[16] pry(main)> b=['3','4','5']
=> ["3", "4", "5"]

 こんな感じで二つの配列があってaにだけ存在する要素を抜き出したい場合、a-bをすればいいらしいですが、上の場合は数値の3と文字列の3が区別されてしまい、下記の通り期待とは違う結果が帰ります。エラーも無し。
[17] pry(main)> a-b
=> [1, 2, 3]
でも下記のようにするとbが数値の配列と見なされて期待する解が得られる。
[18] pry(main)> a-b.map(&:to_i)
=> [1, 2]

 多分、こういう事態になる前に対処すべきだと思うんだけどどうすべきかわからずとりあえず回避法が必要になりました。

参考:
ruby 配列の中の文字列を全部数値にしたい
Rubyでメタプログラミング ~暗黙的に呼ばれるto_procメソッド (.map(&:to_i)について)

要素の有無をチェックする

 ある変数があるかどうかを確認する場合、変数(配列)の場合は.present?、テーブル内に条件に見合う値があるか確認する場合は.exists?が使える。

.present?
[1] pry(main)> a=[1,2,3]
=> [1, 2, 3]
[3] pry(main)> a.present?
=> true

.exists?
[
5] pry(main)> Curation.pluck(:title)
(0.4ms) SELECT "curations"."title" FROM "curations"
=> ["てすと1", "テスト2", "て", "bav", "あああ", "aaaa", "aaa", "sfd", "aaa", "aaaa"]
[6] pry(main)> Curation.pluck(:title).present?
(0.2ms) SELECT "curations"."title" FROM "curations"
=> true

参考:
データの存在を確認(exists?)
Railsでnil? blank? empty? present?を使いこなそう

2014年7月21日月曜日

モデルのテストデータが欲しい

 手で入れてもいいのですが、開発メンバーが同じテストデータで検証したいときとかは、db/seeds.rbにデータを生成するスクリプトを書いておくと良い。
rake db:seed
で、上記コマンドを実行すればデータは生成される。

参考:
rake db:seedを使った初期データの投入