even?メソッド (Ruby)
問題
配列にある値の中から偶数の数をカウントして出力するメソッドを作るという問題です。
even?メソッドとは
対象の値が偶数であれば真を返します。そうでない場合は偽を返します。
10.even?
#=> true
5.even?
#=> false
ちなみにodd?メソッドで、
対象の値が奇数であれば真を返します。そうでない場合は偽を返します。
def count_evens(nums)
count = 0 #偶数の数を出力するために変数countを用意します
nums.each do |num| #each文で配列の中を一つづつ取り出します
if num.even? #even?メソッドで偶数か判定します
count += 1 #偶数の場合、countに1をたします
end #each文の処理が終了し、countに代入された最終的な数を出力します
end
puts count
end
count_evens([2, 1, 2, 3, 4]) #→ 3
count_evens([2, 2, 0]) #→ 3
count_evens([1, 3, 5]) #→ 0
Ruby if else (自分用メモ)
問題
20時から翌朝7時までにオウムに喋られると問題があるのでその場合は「NG」、
それ以外は「OK」と出力するメソッドを作成します。
オウムが喋る時をtrue、喋らない時をfalseと入力することにし、時刻も同時に入力します。
呼び出し方:
parrot_trouble(talking, hour)
def parrot_trouble(talking, hour)
if talking && ( hour < 7 || 20 < hour) #if talking ⬅︎trueのとき真(NG)
puts "NG" #7時までか20時以降のとき真(NG)
else
puts "OK"
end
end
Ruby indexメソッド
indexメソッドindexメソッドは、文字列や配列の中に指定した文字列が含まれていた場合、その文字列の開始位置を整数の値で返すメソッドです。
任意の文字列に"code"が、左から何文字目に出てくるかを返し、その数を出力するメソッドを作りましす。
def count_code(str) puts str.index("code",0)+1 #index(検索したい文字列, 検索を開始する位置) end #先頭を0から数える為、+1をしています count_code("codexxcode") count_code("aaacodebbb") count_code("cozexxcode")
form_for form_tag form_with について
form_for/form_tag/form_withの違い
form_forとform_tagの違いは、基本的にモデルの有無です!
form_forはモデルがある場合に使用し、form_tagはモデルが無い時に使用します。
そして最新環境で使用されているform_with。 こちらはform_tagとform_forの一人二役となっております。
form_for
railsで情報を送信するためのヘルパーメソッド
特定のテーブルにレコードを新規作成する。*モデルがある時に使用(投稿など)
<%= form_for @user do | form | %>
#form_forは引数のインスタンスが何も情報を持っていなければ自動的にcreateアクションへ
#既に情報を持っている場合はupdateアクションへ自動的に振り分けます
<%= form.text_field:email%> #f.htmlタグ:カラム名
<%= form.submit%>
<%end%>
form_tag
railsで情報を送信するためのヘルパーメソッド 特定のテーブルにレコードを新規作成する。*モデルがない時に使用(検索など)
<%= form_tag users_path do %>
#form_tag('PATH’, method: :メソッド名)
<%= text_field_tag :email %>
#中身に関しては、基本的に"_tag"を使用します
<%= submit_tag %>
<% end %>
form_with
form_tagとform_forの一人二役、基本的にはform_forとform_tag同様、モデルの有無によって記述が異なる。
form_withで自動でパスを選択してくれて、HTTPメソッドを指定する必要が無い
コントローラから渡された、ActiveRecordを継承するモデルのインスタンスが利用できる
form_withではinputタグは用いません
モデルなし
<%= form_with url:users_path do | form | %>
<%= form.text_field:email%>
<%= form.submit%>
<%end%>
モデルあり
<%= form_with model:@user do | form | %>
<%= form.text_field:email%>
<%= form.submit%>
<%end%>
モデルを渡したときは、URLとスコープが自動推測されます。
URL: @userがDBにある時はupdateアクションに、無い時はcreateアクションに飛びます。
スコープ: params[:email] が params[:user][:email] になります。
メソッド の種類
- f.label : labelのlabelタグを表示
- f.text_field : textのinputタグを表示
- f.date_select : モデルで設定したフィールドをselectタグで選べるようにして表示
- f.check_box : checkboxのinputタグを表示
- f.number_field: numberのinputタグを表示
- f.submit : submitのinputタグを表示
- f.collection_check_boxes : collection check boxの表示
form_with ヘルパー表
オプション | 説明 | デフォルト値 |
:url | フォームに入力されたデータを送信するURL。名前付きルートを直接使用可能 | nil |
:method | HTTPリクエスト(HTTPメソッド)の指定。 | POST |
:format | 送信するデータ形式 JSON形式やXML形式など:urlオプションが指定された場合は無視される | text/html |
:scope | ルーティングで名前空間が指定されている場合に利用するプレフィックス指定 | nil |
:model | モデルオブジェクト。オブジェクトが新規レコードの場合は作成フォームが生成され、既存レコードの場合は更新フォームが生成される | nil |
:authenticity_token | 認証トークンの指定。カスタム認証トークンでオーバーライドするかfalse、認証トークンフィールドをスキップします。 | |
:local | リモートフォームを使わない設定 | false |
:skip_enforcing_utf8 | IE5以前の文字化け対策(UTF-8の矯正送信)のスキップ設定 | false |
:builder | フォームオブジェクトのオーバーライド(オリジナルフォームコントロールの作成) | nil |
:id | オプションのHTML id属性 | nil |
:class | オプションのHTMLクラス属性 | nil |
:data | オプションのHTMLデータ属性 | nil |
:html | id、class、data以外のオプションHTML属性 | nil |
rails routesの見方
resourcesメソッドでルーティングを 定義した場合、アクションのルーティングを確認することができません。 そんなときは”rails routes”を使用します。
(ブラウザ上で"http://localhost:3000/rails/info"でみれます。)
Prefix Verb URI Pattern Controller#Action new_user_session GET /users/sign_in(.:format) devise/sessions#new user_session POST /users/sign_in(.:format) devise/sessions#create destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy new_user_password GET /users/password/new(.:format) devise/passwords#new edit_user_password GET /users/password/edit(.:format) devise/passwords#edit user_password PATCH /users/password(.:format) devise/passwords#update PUT /users/password(.:format) devise/passwords#update POST /users/password(.:format) devise/passwords#create cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel new_user_registration GET /users/sign_up(.:format) devise/registrations#new edit_user_registration GET /users/edit(.:format) devise/registrations#edit user_registration PATCH /users(.:format) devise/registrations#update PUT /users(.:format) devise/registrations#update DELETE /users(.:format) devise/registrations#destroy POST /users(.:format) devise/registrations#create root GET / items#index item_orders GET /items/:item_id/orders(.:format) orders#index POST /items/:item_id/orders(.:format) orders#create items GET /items(.:format) items#index POST /items(.:format) items#create new_item GET /items/new(.:format) items#new edit_item GET /items/:id/edit(.:format) items#edit item GET /items/:id(.:format) items#show PATCH /items/:id(.:format) items#update PUT /items/:id(.:format) items#update DELETE /items/:id(.:format) items#destroy |
"routes.rb"で定義したルーティングの出力結果の意味は一番上の項目にあります。
Prefix
Prefixはパスが代入されている変数のようなものです。
Prefixを使うときは末尾に_pathと追記します。
prefixを確認するとルートパスを表す/というパスはrootになっています。
なのでlink_toのパスを指定する場所には_pathをつけたroot_pathを書いてあげれば/で指定した記述と同じになります。
パスにidが入っているときはidの情報が入っているインスタンスを引数として渡してあげることにより指定ができます。
例えばusersコントローラーのshowアクションを動かすときは通常のパスだとusers/"ユーザーのid"になりますが、Prefixを使って書くとuser_path(@user)のような記述になります。
@userはコントローラーで@user = User.find(params[:id])などで記述してあげれば@userの中にはそのユーザーのidも含まれているのでuser_pathの引数として指定できます。
Verb
HTTPメソッドを表します。
URI Patternのパスにどのhttpリクエストでアクセスするかを示しています
get: リソースを取得する。サイトを閲覧する時に利用する。
post: リソースを保存する。
delete: リソースを削除する。
patch: リソースを更新する。
URI Pattern
ルーティングのパスを表します
Controller#Action
httpリクエストでパスが送られた際に処理が行われるコントローラとアクションを表します。
コントローラ名#アクション名です
CRUD
C(Create):生成
R(Read):読み取り
U(Update):更新
D(Delete): 削除
任意の文字列から指定文字列を数える方法 scan Ruby
任意の文字列で
"hi"がいくつあるか数えてその数を出力するメソッドを作ります。
出力例:
count_hi('abc hi ho') → 1
count_hi('ABChi hi') → 2
count_hi('hihi') → 2
def cunt_hi(str) puts str.scan("hi").length end puts "hiの数は" hi = gets.to_s cunt_hi(hi)
変数strに格納された文字列に"hi"がいくつあるか数える為、scanメソッドを使用します。
"foobar".scan(/../) # => ["fo", "ob", "ar"]
"foobar".scan("o") # => ["o", "o"]
"foobarbazfoobarbaz".scan(/ba./) # => ["bar", "baz", "bar", "baz"]
"foobar".scan(/(.)/) # => [["f"], ["o"], ["o"], ["b"], ["a"], ["r"]]
"foobarbazfoobarbaz".scan(/(ba)(.)/) # => [["ba", "r"], ["ba", "z"], ["ba", "r"], ["ba", "z"]]
あとは配列の中の要素の数をlengthメソッドで数えます。
Ruby if 論理演算子 (自分ようメモ)
def police_trouble(a, b) if a && b || !a && !b puts "True" else puts "False" end end police_trouble(true, true) #True police_trouble(false, false) #True police_trouble(true, false) #False
# aもbもtrueの場合にtrue a && b # aかbのどちらかがtrueの場合にtrue a || b # aがtrueの場合にfalse、aがfalseの場合にtrue !a
(a && b) || (!a && !b)
とすることでaとbがどちらもtrue、もしくはどちらもfalseのときに"True"
と出力され、それ以外は"False"
と出力されるようにしています。