yuuki blog

プログラミング をアプトプットしています。

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"と出力されるようにしています。