HTTPメソッド
HTTPメソッドとは、ブラウザからアプリケーションにアクセスするときにサーバーに対して出されるお願いのことです。
HTTPメソッドにはたくさんの種類がありますが、特に使うGETとPOSTの違いが曖昧だったのでまとめていこうと思います。
HTTPメソッドのGETとPOSTの違い
GETは何か情報を検索したり取得したいとき、リンクをクリックし見たいページに飛ぶことができます。
GETメソッドを利用してデータを送る場合、URLにデータが組み込まれるため、送ったデータがWebブラウザの閲覧履歴に残ってしまいます。
POSTは基本的にサーバーのデータベースにデータを保存したいときなどに使われます。
(例 : ユーザー登録の時ユーザーのデータを送信する)
登録処理や更新処理などの、書き込みがありデータが更新される可能性のある処理に対して使うメソッドになります。
POSTメソッドを利用するのは、パスワードのような秘匿情報をURLに表示したくない場合です。
だからログインなどで個人情報を送る可能性のあるときにはPOSTを使います。
まとめ
GETは情報を取得するときに使うものです。
POSTは新しい情報の登録をするときに使うものです。
form_withについて
form_withメソッドとは
入力フォームを実装するためのヘルパーメソッドです。
form_withには、model:とurl:オプションがあります。
基本的にはmodel:オプションを使用します。
model:オプションを使うとき
関連するモデルがある場合に使います。
主に投稿フォームなど、入力されたデータを保存する必要があるときに使用します。
# コントローラー tasks_controller.rb def new @task = Task.new #newアクションで新しいTaskオブジェクトを生成して、インスタンス変数@taskに代入 end
# ビューファイル new.html.erb <%= form_with model: @task, local: true do |f| %> <%= f.label :name %> <%= f.submit %> <% end %>
※ local: trueはデフォルトではajax通信になってしまうため記述する必要があります。
モデルを渡したときは、URLが自動推測されます。
@userがデータベースに存在するとき(更新)はupdateアクションに、ないときはcreateアクションに飛びます。
model:にインスタンス変数を渡しておくと、入力ミスなどで登録等が失敗したときに、
入力フォームに値を残すことができます。
どんなときにurl:オプションを使うのか
モデルとフォームが紐づかないとき
createやupdateを行うコントローラがモデルと紐づかないとき
主に検索フォームやログインフォームなどの
フォームに入力されたデータを保存する必要がないときに使います。
<%= form_with url: login_path, local: true do |f| %> <%= f.text_field :email %> <%= f.submit %> <% end %>
Strong Parameters
Strong Parametersとは
重要な情報を悪意ある変更から守るために設定する仕組みです。
nameやemail、passwordなど他のユーザーに書き換えられ、更新されたら困るデータを守ります。
def create task = Task.new(task_params) end private def task_params params.require(:task).permit(:name, :description) end
requireメソッドとpermitメソッド
.requireメソッド
データのオブジェクト名を定めます。
.permitメソッド
変更を加えることのできるキーを指定します。
privateメソッドを追加しているので、task_paramsは、
.permitメソッドで許可していない項目については変更されず、データを安全に扱うことができるようになります。
補足
※paramsとは
サービスの利用者(ユーザー)がサーバーに対して送ってきた値を受け取るためのメソッドです。
もっと簡単に言うと「URLから送られてくる情報を受け取るメソッド」のことです。
attr_accessor
attr_accessorを理解する前に、インスタンス変数、ゲッター、セッターについてまとめます。
インスタンス変数
変数名の先頭に@をつけることで作ることができ、
同じオブジェクト内であれば、複数のメソッドをまたいで使うことができます。
またオブジェクトが存在する間はずっと使うことができます。
しかし!!オブジェクトの外側からは直接使うことができません!!!
なのでインスタンス変数の情報を外で使うためのメソッドを追加してみます。(ゲッター)
またインスタンス変数へ代入するメソッドもついでに作ってみます。(セッター)
class User # nameメソッドを作って、インスタンス変数@nameを戻り値とする(ゲッター) def name @name end # name=メソッドは引数で受け取ったデータをインスタンス変数@nameに代入している(セッター) def name=(text) @name = text end end user = User.new user.name = "太郎" puts user.name
実行結果
ruby user.rb 太郎
ゲッター
インスタンス変数を戻り値とするメソッドを追加して、それを呼び戻します。
短い書き方として、
attr_reader :変数名
があります。役割は「参照」
セッター
引数で受け取ったデータをインスタンス変数に代入します。
短い書き方として、
attr_writer :変数名
があります。役割は「更新」
ゲッターとセッターを使ってコードを書き換える
class User attr_reader :name attr_writer :name end user = User.new user.name = "太郎" puts user.name
attr_accessor
上記のゲッターとセッターの2つを合体させたのが、
attr_accessorメソッドです。
attr_accessorを使ってコードを書き換える
class User attr_accessor :name end user = User.new user.name = "太郎" puts user.name
attr_accessorを使うと、インスタンス変数を使うことができるようになり、
簡単にセッターとゲッターを実装することができるようになりました。
initializeメソッド
initializeメソッドとは
オブジェクトが新しく作られるとき(newメソッドが呼び出されたとき)に自動で呼び出されるメソッドで、主にインスタンス変数の初期値を設定します。
class Hello def initialize(name) # インスタンス変数@nameに引数を代入 @name = name end def talk # インスタンス変数を使って出力 puts "hello, #{@name}" end end # newメソッドが呼ばれるとオブジェクトが作られて、initializeメソッドが自動で呼ばれる(引数にtaroが代入される) hello = Hello.new("taro") # initializeメソッドでtaroがインスタンス変数に代入されてtalkメソッドで使われる hello.talk
実行結果
hello, taro
補足
initializeメソッドはprivateと書かなくても、自動的にprivateメソッドになっています。
そのため外部から使用することはできません。
使用頻度が高いからこそしっかり身につけるために文字にして残しておきます。 終わり
ARGVとは
例外処理の勉強をしているときに出てきたARGV。
なんとなくわかるけど、説明はできないと思ったのでまとめてみることにしました。
ARGV : 読み方(アーグブイ)
配列オブジェクト。
またRubyが用意する組み込み定数の一つです。
コマンドラインに入力したデータをスクリプトの引数として渡すことができます。
試しに使ってみます。
name = ARGV[0] age = ARGV[1] puts "私は#{name}、#{age}歳です。"
ターミナルで実行してみます。
ruby name.rb 花子 20 # ruby [ファイル名] [0番目の引数] [1番目の引数] と入力します。 結果 >> 私は花子、20歳です。
引数から取得したデータは文字列になっているので、
数値として扱いたい時は、to_iメソッドを使います。
number0 = ARGV[0].to_i number1 = ARGV[1].to_i puts "#{number0} + #{number1} = #{number0 + number1}"
結果は、、、
ruby number.rb 6 27 >> 6 + 27 = 33
ARGV.first とすると何個かある引数のうちの先頭の引数を指定することができます。
※ ARGV.firstとARGV[0]は同じ意味。
puts "僕は#{ARGV[2]}番目に着きました。" puts "私が#{ARGV.first}番目に着きました。"
ruby arrival.rb 1 2 3 >> 僕は3番目に着きました。 >> 私が1番目に着きました。
終わり。
例外処理
想定外の問題が発生した時、Rubyはエラーメッセージを表示してプログラムを停止させます。
ええ。なんかエラー出た。。先に進めない。。。
そんな時に、これはエラーだよ!間違えてるよ!と教えてくれたらとっても親切ですよね。
そこで、、、わかりやすくエラーメッセージを書き換えるための例外処理という機能を使っていきます。
begin
# 例外が発生するかもしれない処理
rescue 例外クラス => e
# 例外オブジェクトを変数eに代入
# 例外が発生した時に実行する処理
ensure
# 例外の発生有無にかかわらず必ず実行される処理
end
※ beginとendは省略できます。
rescueの後ろに書く「例外クラス」には、
ZeroDivisionError : 0での割り算を行った時に発生する例外クラス
ArgumentError : メソッドの引数の数が間違っている時に発生する例外クラス
NameError : 変数名を間違えた時に発生する例外クラス
NoMethodError : メソッド名を間違えた時に発生する例外クラス
SystemCallError : ファイル操作などに失敗した時に発生する例外クラス
などが入ります。
「例外クラス」は省略可。
省略した場合、StandardErrorが代入されますが、
上に書いたような例外クラスは、StandardErrorに属してるので問題なく省略できます。
puts "駅まで何メートルありますか?" length = gets.to_i # gets はキーボードからの入力を取り込むメソッド puts "何分歩きましたか?" time = gets.to_i begin speed = length / time puts "速さは分速#{speed}mです。" rescue ZeroDivisionError => e puts "あれ?0分だと計算できないよ〜" puts "例外クラス: #{e.class}" puts "例外メッセージ: #{e.message}" # classとmessageは例外クラスで使えるメソッド ensure puts "お疲れさま" end
例外が発生しない時は、rescueの処理は実行されない。
beginの処理 + ensureの処理 が出力されます。
駅まで何メートルありますか? 700 何分歩きましたか? 5 速さは分速140mです。 お疲れさま
例外が発生する時は、rescueの処理を実行する。
rescueの処理 + ensureの処理 が出力されます。
駅まで何メートルありますか? 700 何分歩きましたか? 0 あれ?0分だと計算できないよ〜 例外クラス: ZeroDivisionError 例外メッセージ: divided by 0 お疲れさま
例外を発生させるraiseメソッドというものもあります。
raise "例外メッセージ"
※例外メッセージのみを指定するとRuntimeError例外が発生します。
特定の例外クラスを指定することもできます。例えば、
raise NameError, "例外メッセージ"
※NameError例外を発生させるときはこのように書きます。
例外処理は引数を書き忘れてしまいそうな処理の時とかに使えそうですね!
遠くない未来、バリバリ使えるように精進します。