- 投稿日:2020-07-02T23:14:59+09:00
created_atで与えられる日時を整形する
sqlで生成されるcreated_atを整形するのに悩んだため、その実装方法のメモsqlファイル
テーブルを作成する。
table.sqlcreate table todos ( id integer PRIMARY key, body text, created_at );rbファイル
active recordを用いて、先ほど作成したtodosテーブルをオブジェクトに結びつける。
tlist.rbclass Todos < ActiveRecord::Base validates :body, presence: true end
オブジェクトをインスタンス変数に格納する。
tlist.rbget '/' do @todos = Todos.all erb :index enderbファイル
時刻を表示してみる。
index.erb<div class="user_box"> <p class="user_name">しゅうと</p> <ul> <% @todos.where(users_userName: "しゅうと").each do |todo|%> <li data-id = "<%= todo.id%>" data-token = "<%= Rack::Csrf.csrf_token(env)%>"> <div class="one"> <%= Rack::Utils.escape_html(todo.body)%> </div> <div class="time"> <%= todo.created_at%> <span class="delete">[x]</span> </div> </li> <% end%> </ul> </div>
調べたところ、strftimeメソッドで整形できる模様。
メソッドを適用して実行。index.erb<div class="user_box"> <p class="user_name">しゅうと</p> <ul> <% @todos.where(users_userName: "しゅうと").each do |todo|%> <li data-id = "<%= todo.id%>" data-token = "<%= Rack::Csrf.csrf_token(env)%>"> <div class="one"> <%= Rack::Utils.escape_html(todo.body)%> </div> <div class="time"> <%= todo.created_at.strftime("%Y/%m/%d %H:%M:%S")%> <span class="delete">[x]</span> </div> </li> <% end%> </ul> </div>
文字列だと怒られました。
文字列以外に変換する必要があるみたいなので、date型に変換してみる。
index.erb<div class="user_box"> <p class="user_name">しゅうと</p> <ul> <% @todos.where(users_userName: "しゅうと").each do |todo|%> <li data-id = "<%= todo.id%>" data-token = "<%= Rack::Csrf.csrf_token(env)%>"> <div class="one"> <%= Rack::Utils.escape_html(todo.body)%> </div> <div class="time"> <%= todo.created_at.to_date.strftime("%Y/%m/%d %H:%M:%S")%> <span class="delete">[x]</span> </div> </li> <% end%> </ul> </div>
time型に変換して実行してみる。
index.erb<div class="user_box"> <p class="user_name">しゅうと</p> <ul> <% @todos.where(users_userName: "しゅうと").each do |todo|%> <li data-id = "<%= todo.id%>" data-token = "<%= Rack::Csrf.csrf_token(env)%>"> <div class="one"> <%= Rack::Utils.escape_html(todo.body)%> </div> <div class="time"> <%= todo.created_at.to_time.strftime("%Y/%m/%d %H:%M:%S")%> <span class="delete">[x]</span> </div> </li> <% end%> </ul> </div>
どんな形式で与えられているのか、エラーに直面した際には調べる必要性がありますね。
なおこのアプリケーションの原型はドットインストールのsinatra入門を参考にしています。
- 投稿日:2020-07-02T18:46:43+09:00
【Ruby理解度チェック】何が起きているか説明できますか? &&とandの違い
面白い質問があったのでテスト形式でシェア
現象
def ampersand_return puts "foo" && return puts "bar" end def and_return puts "foo" and return puts "bar" end > ampersand_return => nil > and_return foo bar => nil何が起きているか説明できますか?
回答
原則として、
&&
とand
の違いはその優先順位にある
&& return
の方
&&
が先に演算され、以下と同値になるputs ("foo" && return)
"foo"
はtruthyなので、右辺のreturn
が処理され、メソッドは何も出力せずreturnする。
and return
の方
puts "foo"
が先に演算され、以下と同値になる(puts "foo") and return
puts
はnil
を返すのでand
の右辺は処理されず、"foo"
と"bar"
両方が出力されメソッドは正常終了する。終わりに
and
の例のようにmethod callが優先される演算子に関しては、ドキュメントには明記されていない?よう
このStack Overflow Answerによるとand
,or
,if
,unless
,until
,while
,rescue
がこの挙動をするらしい
- 投稿日:2020-07-02T18:46:43+09:00
【Ruby理解度チェック】何が起きているか説明できますか? &&とand
面白い質問があったのでテスト形式でシェア
現象
def ampersand_return puts "foo" && return puts "bar" end def and_return puts "foo" and return puts "bar" end > ampersand_return => nil > and_return foo bar => nil何が起きているか説明できますか?
回答
原則として、
&&
とand
の違いはその優先順位にある
&& return
の方
&&
が先に演算され、以下と同値になるputs ("foo" && return)
"foo"
はtruthyなので、右辺のreturn
が処理され、メソッドは何も出力せずreturnする。
and return
の方
puts "foo"
が先に演算され、以下と同値になる(puts "foo") and return
puts
はnil
を返すのでand
の右辺は処理されず、"foo"
と"bar"
両方が出力されメソッドは正常終了する。終わりに
and
の例のようにmethod callが優先される演算子に関しては、ドキュメントには明記されていない?よう
このStack Overflow Answerによるとand
,or
,if
,unless
,until
,while
,rescue
がこの挙動をするらしい
- 投稿日:2020-07-02T18:39:30+09:00
【Rails】hamlコード早見表
Github公式 Haml-rails
チュートリアル HamlTutorial導入
Gemfile# 以下を追加し`bundle install` gem "haml-rails", "~> 2.0" # Rails4の場合 gem "haml-rails", "~> 1.0.0" # Rails3の場合 gem "haml-rails", "~> 0.4.0"html.erbをhtml.hamlに変換
$ rails generate haml:application_layout convert
全てのerbファイルを変換する場合
$ rails haml:erb2haml
HTMLコード
erb<div>blue</div> <div class="sky">blue</div> <div class="sky">blue</div> <div class="sky" id="line">blue</div>haml%div blue %div.sky blue .sky blue .sky#line blueRubyコード
erb<% if user_signed_in? %> <%= hoge %> <% else %> <%= skyblue %> <% end %>haml- if user_signed_in? = hoge - else = skyblueネスト
erb<div class="header-nav"> <nav> <ul class="nav-list"> <% if current_user %> <li class="list-item"><%= content %></li> <li class="list-item" id="sky"><%= link_to "blue" %></li> <% else %> <li class="list-item"><%= content %></li> <li class="list-item" id="sky"><%= link_to "blue" %></li> <% end %> </ul> </nav> </div>haml.header-nav %nav %ul.nav-list - if current_user %li.list-item= content %li.list-item#sky= link_to "blue" - else %li.list-item= content %li.list-item#sky= link_to "blue"
- 投稿日:2020-07-02T17:44:15+09:00
Railsでproduction環境運用する際にしたほうがいい設定
ブラウザ上のエラー表示をdevelopmentとproduction環境で同じにする
まずdevelopment環境でERRORが発生するとブラウザに詳細情報が表示されます。
しかし、production環境だと何かしらのERRORが発生したとしても「We’re sorry, but something went wrong.」と表示されてしまいます。
そこでproduction環境でもブラウザに詳細情報を表示させるには
config.consider_all_requests_local = false
をtrue
にしてあげれば良い。config/environments/production.rbconfig.consider_all_requests_local = true参考文献
本番環境でDBをresetする
Rails5以降のproduction環境では、db:dropやdb:resetなどのDBを破壊する系のコマンド実行を防止する機能が追加された。
そのためproduction環境でbundle exec rake db:migrate:reset RAILS_ENV=production
などをしてもエラーを発生してしまう。対処法
環境変数に
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
を指定してあげれば良い。$ bundle exec rake db:migrate:reset RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1参考文献
Rails5のproductionでrake db:dropはできない、普通には
知っておくべきRailsのconfig/enviroments配下の設定
下記サイト一通り目を通すことでproduction環境で詰まった際に解決の糸口が分かるかも?
Railsのconfig/enviroments配下を読んでみる
- 投稿日:2020-07-02T17:29:51+09:00
備忘録 会計freeeAPI叩いた時ハマったこと
GETでクエリ指定する場合は、ちゃんとuri.request_uriでhttp通信しようね
これに尽きます、会計freeeのAPI仕様とかじゃなくただ単に自分の凡ミスだった。
rubyで叩いた
OAuth(オーオース)2.0でACCESS_TOKENは取得済み。
こんな感じでパラメーターをセットしてBASE_URL = 'https://api.freee.co.jp' MY_COMPANY_ID = '*********' USE_ACCESS_TOKEN_HEADER = { "accept" => "application/json", "Authorization"=> "Bearer *************************" }以下のように取引先の詳細を取得するAPIを叩いたところ
(分かりやすくかなり単純なメソッドにしてます)def get_torihiki_id(name) uri = URI.parse(BASE_URL + '/api/1/partners') uri.query = URI.encode_www_form({"company_id" => MY_COMPANY_ID ,'keyword'=> name}) http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true headers = USE_ACCESS_TOKEN_HEADER response = http.get(uri.path, headers) res_hash = JSON.parse(response.body) res_hash end puts get_torihiki_id('hoge株式会社')このようなレスポンスになった。
{"status_code"=>400, "errors"=>[{"type"=>"validation", "messages"=>["company_id が指定されていません。"]}]}company_id指定してるのになぁ〜
なんでだろうなー
かなり考え込んでしまいました。原因
この一文
response = http.get(uri.path, headers)uri.pathのみでhttp通信を行なっていた。
クエリ設定してるのに使ってないじゃん、、、
正しくはresponse = http.get(uri.request_uri, headers)GETでurlにパラメーター埋め込む時は、ちゃんと使わないとですね、、、
日々精進
- 投稿日:2020-07-02T17:29:51+09:00
備忘録 会計freeeAPI叩いた時に詰まったこと
GETでクエリ指定する場合は、ちゃんとuri.request_uriでhttp通信しようね
これに尽きます、会計freeeのAPI仕様とかじゃなくただ単に自分の凡ミスだった。
rubyで叩いた
OAuth(オーオース)2.0でACCESS_TOKENは取得済み。
こんな感じでパラメーターをセットしてBASE_URL = 'https://api.freee.co.jp' MY_COMPANY_ID = '*********' USE_ACCESS_TOKEN_HEADER = { "accept" => "application/json", "Authorization"=> "Bearer *************************" }以下のように取引先の詳細を取得するAPIを叩いたところ
(分かりやすくかなり単純なメソッドにしてます)def get_torihiki_id(name) uri = URI.parse(BASE_URL + '/api/1/partners') uri.query = URI.encode_www_form({"company_id" => MY_COMPANY_ID ,'keyword'=> name}) http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true headers = USE_ACCESS_TOKEN_HEADER response = http.get(uri.path, headers) res_hash = JSON.parse(response.body) res_hash end puts get_torihiki_id('hoge株式会社')このようなレスポンスになった。
{"status_code"=>400, "errors"=>[{"type"=>"validation", "messages"=>["company_id が指定されていません。"]}]}company_id指定してるのになぁ〜
なんでだろうなー
かなり考え込んでしまいました。原因
この一文
response = http.get(uri.path, headers)uri.pathのみでhttp通信を行なっていた。
クエリ設定してるのに使ってないじゃん、、、
正しくはresponse = http.get(uri.request_uri, headers)GETでurlにパラメーター埋め込む時は、ちゃんと使わないとですね、、、
日々精進
- 投稿日:2020-07-02T14:18:53+09:00
稼ぎたいなら食わず嫌いしない。上に立つ人こそ色々と試そう。
今時のリーダーは、率先して色々と試し、失敗し、部下を成功の最短ルートで動かすものだ。
これはIT業界に限ったことではない。フリーランスで年収を上げるのも、専門技術の高さより、幅広い技術の方が年収を上げやすい。
また、副業で稼ぐにも、幅広い技術がいい。私は旅行代理店のシステム開発で副業していたことがあるが、その時は、PHPとRubyだった。
フリーランスのメインの仕事では、Javaだった。副業、クラウドソーシングでは、PHPばっかである。
ただ、フリーランスの仕事では、PHPはかなり減った。PHPの将来性を検索すれば、残るという意見も無くなるという意見もあるが、
それは、副業で考えるか、フリーランスの仕事で考えるか、で変わってくる。結局、自分で試して、自分で考えるしかない。
この試すという手間を検索して、人の意見を聞いて終わりにしないということである。Ruby が出たばかりのころ、Perl と Python が消えると騒がれた。
私は全部試して、業務でも使用した。
Ruby の急成長は予想できなかったが、Perl が消える予想は当たった。
当時、Perl の将来性を検索したら、使用している企業が多いから、消えることはないという意見が多かった。私が消えると言っているのは、稼げないという意味である。
Rust は良い言語だが、PHP はダメだ。 みたいなのは、思い込みである。
PHPの方が楽だし、稼げる。
言いたいことは、状況によるから決めつけるなということ。
そして、自分で試して、情報に流されないということ。今時、開発言語の選定はかなり難しい。
検索して判断せずに、是非、試してから判断して欲しい。
- 投稿日:2020-07-02T11:57:45+09:00
文字列から指定の文字以降を削除する
- 投稿日:2020-07-02T07:35:04+09:00
Webpacker::Manifest::MissingEntryError in Devise::Sessions#newというエラーが出た時の解決法
開発環境
・Rails 6.0.3.1
・Ruby 2.6.6エラー時の状況
$ rails sコマンドを実行して
localost3000
にアクセスすると、【エラー内容】 Webpacker::Manifest::MissingEntryError in Devise::Sessions#new Showing /Users/XXXX_XXXX/Desktop/XXX_XXX_XXX/app/views/layouts/application.html.erb where line #9 raised: Webpacker can't find application in /Users/XXXX_XXXX/Desktop/XXX_XXX_XXX/public/packs/manifest.json. Possible causes: 1. You want to set webpacker.yml value of compile to true for your environment unless you are using the `webpack -w` or the webpack-dev-server. 2. webpack has not yet re-run to reflect updates. 3. You have misconfigured Webpacker's config/webpacker.yml file. 4. Your webpack configuration is not creating a manifest. Your manifest contains:というエラーが出た。
該当部分は
application.html.erb<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>と書いてある。
解決方法
$ bundle exec rails webpacker:installを実行したらエラーが解決できた。
- 投稿日:2020-07-02T06:58:44+09:00
Ruby インスタンスメソッドについて
インスタンスメソッドについての曖昧な知識の補完として書きます。
間違いなどありましたら、コメントいただけますと幸いです。インスタンスメソッド
・クラス構文内でメソッドを定義するとインスタンスメソッドになる。
・そのクラスのインスタンスに対して呼び出せる。class Car # インスタンスメソッドを定義する(ここではnameメソッド) def name "yellow cab" end end # クラス名.newでインスタンスを作成して変数taxiに代入 taxi = Car.new # インスタンスメソッドを呼び出す taxi.name #=> "yellow cab"まとめ
・インスタンスメソッドはクラス内で定義する。
・インスタンスを作成してから、インスタンスメソッドを呼び出す。
・インスタンスメソッドは、「インスタンス.メソッド」で呼び出せる。参考にしたリンクや書籍
・メソッドとクラスメソッドとインスタンスメソッドが曖昧だった
https://qiita.com/right1121/items/c74d350bab32113d4f3d
・【Ruby】クラスとかインスタンスについて改めて学習してみた
https://qiita.com/ksk_diffeasy/items/734b4961e9e6c7480d33
・「プロを目指す人のためのRuby入門」 伊藤淳一[著]
https://ruby-book.jnito.com/
- 投稿日:2020-07-02T00:56:04+09:00
もしもピカチュウが100まで数えたら
ゴミ箱に入っていたのをサルベージしました。
ピが2個続いている場所をよく聞けばピカピピカピカ=11にも対応できるのがコツ(?)
もしもピカチュウが「カピ」と鳴くことがあれば、もうこれは成立しない。(0..100).each{|i| p i;p i.to_s(2).rjust( (i.to_s(2).size % 2) + i.to_s(2).size ,"0");puts i.to_s(2).rjust( (i.to_s(2).size % 2) + i.to_s(2).size ,"0").scan(/.{1,#{2}}/).map{|a| a.gsub(/.*/,{"00" =>"ピィカァ" ,"01" => "ピカチュウ" ,"10" => "ピカピ","11" => "ピカピカ"})}.join("") }irb(main):001:0> (0..100).each{|i| p i;p i.to_s(2).rjust( (i.to_s(2).size % 2) + i.to_s(2).size ,"0");puts i.to_s(2).rjust( (i.to_s(2).size % 2) + i.to_s(2).size ,"0").scan(/.{1,#{2}}/).map{|a| a.gsub(/.*/,{"00" =>"ピィカァ" ,"01" => "ピカ チュウ" ,"10" => "ピカピ","11" => "ピカピカ"})}.join("") } 0 "00" ピィカァ 1 "01" ピカチュウ 2 "10" ピカピ 3 "11" ピカピカ 4 "0100" ピカチュウピィカァ 5 "0101" ピカチュウピカチュウ 6 "0110" ピカチュウピカピ 7 "0111" ピカチュウピカピカ 8 "1000" ピカピピィカァ 9 "1001" ピカピピカチュウ 10 "1010" ピカピピカピ 11 "1011" ピカピピカピカ 12 "1100" ピカピカピィカァ 13 "1101" ピカピカピカチュウ 14 "1110" ピカピカピカピ 15 "1111" ピカピカピカピカ 16 "010000" ピカチュウピィカァピィカァ 17 "010001" ピカチュウピィカァピカチュウ 18 "010010" ピカチュウピィカァピカピ 19 "010011" ピカチュウピィカァピカピカ 20 "010100" ピカチュウピカチュウピィカァ 21 "010101" ピカチュウピカチュウピカチュウ 22 "010110" ピカチュウピカチュウピカピ 23 "010111" ピカチュウピカチュウピカピカ 24 "011000" ピカチュウピカピピィカァ 25 "011001" ピカチュウピカピピカチュウ 26 "011010" ピカチュウピカピピカピ 27 "011011" ピカチュウピカピピカピカ 28 "011100" ピカチュウピカピカピィカァ 29 "011101" ピカチュウピカピカピカチュウ 30 "011110" ピカチュウピカピカピカピ 31 "011111" ピカチュウピカピカピカピカ 32 "100000" ピカピピィカァピィカァ 33 "100001" ピカピピィカァピカチュウ 34 "100010" ピカピピィカァピカピ 35 "100011" ピカピピィカァピカピカ 36 "100100" ピカピピカチュウピィカァ 37 "100101" ピカピピカチュウピカチュウ 38 "100110" ピカピピカチュウピカピ 39 "100111" ピカピピカチュウピカピカ 40 "101000" ピカピピカピピィカァ 41 "101001" ピカピピカピピカチュウ 42 "101010" ピカピピカピピカピ 43 "101011" ピカピピカピピカピカ 44 "101100" ピカピピカピカピィカァ 45 "101101" ピカピピカピカピカチュウ 46 "101110" ピカピピカピカピカピ 47 "101111" ピカピピカピカピカピカ 48 "110000" ピカピカピィカァピィカァ 49 "110001" ピカピカピィカァピカチュウ 50 "110010" ピカピカピィカァピカピ 51 "110011" ピカピカピィカァピカピカ 52 "110100" ピカピカピカチュウピィカァ 53 "110101" ピカピカピカチュウピカチュウ 54 "110110" ピカピカピカチュウピカピ 55 "110111" ピカピカピカチュウピカピカ 56 "111000" ピカピカピカピピィカァ 57 "111001" ピカピカピカピピカチュウ 58 "111010" ピカピカピカピピカピ 59 "111011" ピカピカピカピピカピカ 60 "111100" ピカピカピカピカピィカァ 61 "111101" ピカピカピカピカピカチュウ 62 "111110" ピカピカピカピカピカピ 63 "111111" ピカピカピカピカピカピカ 64 "01000000" ピカチュウピィカァピィカァピィカァ 65 "01000001" ピカチュウピィカァピィカァピカチュウ 66 "01000010" ピカチュウピィカァピィカァピカピ 67 "01000011" ピカチュウピィカァピィカァピカピカ 68 "01000100" ピカチュウピィカァピカチュウピィカァ 69 "01000101" ピカチュウピィカァピカチュウピカチュウ 70 "01000110" ピカチュウピィカァピカチュウピカピ 71 "01000111" ピカチュウピィカァピカチュウピカピカ 72 "01001000" ピカチュウピィカァピカピピィカァ 73 "01001001" ピカチュウピィカァピカピピカチュウ 74 "01001010" ピカチュウピィカァピカピピカピ 75 "01001011" ピカチュウピィカァピカピピカピカ 76 "01001100" ピカチュウピィカァピカピカピィカァ 77 "01001101" ピカチュウピィカァピカピカピカチュウ 78 "01001110" ピカチュウピィカァピカピカピカピ 79 "01001111" ピカチュウピィカァピカピカピカピカ 80 "01010000" ピカチュウピカチュウピィカァピィカァ 81 "01010001" ピカチュウピカチュウピィカァピカチュウ 82 "01010010" ピカチュウピカチュウピィカァピカピ 83 "01010011" ピカチュウピカチュウピィカァピカピカ 84 "01010100" ピカチュウピカチュウピカチュウピィカァ 85 "01010101" ピカチュウピカチュウピカチュウピカチュウ 86 "01010110" ピカチュウピカチュウピカチュウピカピ 87 "01010111" ピカチュウピカチュウピカチュウピカピカ 88 "01011000" ピカチュウピカチュウピカピピィカァ 89 "01011001" ピカチュウピカチュウピカピピカチュウ 90 "01011010" ピカチュウピカチュウピカピピカピ 91 "01011011" ピカチュウピカチュウピカピピカピカ 92 "01011100" ピカチュウピカチュウピカピカピィカァ 93 "01011101" ピカチュウピカチュウピカピカピカチュウ 94 "01011110" ピカチュウピカチュウピカピカピカピ 95 "01011111" ピカチュウピカチュウピカピカピカピカ 96 "01100000" ピカチュウピカピピィカァピィカァ 97 "01100001" ピカチュウピカピピィカァピカチュウ 98 "01100010" ピカチュウピカピピィカァピカピ 99 "01100011" ピカチュウピカピピィカァピカピカ 100 "01100100" ピカチュウピカピピカチュウピィカァ => 0..100ピカピカピカチュウは13
- 投稿日:2020-07-02T00:16:02+09:00
Rubyを2行でセグフォらせる
流行ってると聞いたのでRubyでもやってみました
require 'fiddle' Fiddle::Pointer[0].ptrワンライナー
ruby -r fiddle -e 'Fiddle::Pointer[0].ptr'なんでこれでセグフォるのかはあんまり理解していません…。