LoginSignup
0
0

More than 3 years have passed since last update.

TECH  DAY 7

Last updated at Posted at 2019-07-20

勉強した項目: git, Github, scraping
時間: 10:30
内容:

*学習アウトプットです。なにぶん間違いなんかもあります。気をつけますがその際はご指摘いただけますと幸いです*

[リダイレクト]

本来アクセスしたページとは別のページへ移動すること
redirect_toというメソッドでリダイレクトさせることができる、またactionオプションを使用することで特定のアクションを指定することが可能

redirect_to action: アクション名
def create
    # Review.create(create_params)
    redirect_to controller: :apps, action: :index
end

[requireメソッド]

form_forに入力されたデータはparamsの中に以下のような形でコントローラに送るメソッド

new.html.erb
<%= form_for(@app) do |f| %>
  <%= f.text_field :name %>
  <%= f.text_area :detail %>
<% end %>
ターミナル
params
# { app: { name: "入力された名前", detail: "入力された詳細" } }
例/apps_controller.rb
params
# { app: { name: "入力された名前", detail: "入力された詳細" } }
params.require(:app)
# => { name: "入力された名前", detail: "入力された詳細" }

[form_tag]

paramsは、ビューファイルのフォームで与えたname属性キーとなっている
それぞれのキーに対して、入力した情報がとして紐付いている
このハッシュ構造を生成するform_tagでは、params.permit(:キー名)で取得できる

[form_for]

paramsは、ハッシュの中にハッシュが存在する二重構造になっている
reviewというキーに対応する値そのものがハッシュだからであり、そのハッシュの中には、カラム名がキーとなり、入力した情報が値として紐付いている。
このハッシュ構造を生成するform_forでは、params.require(:モデル名).permit(:カラム名)で入力した情報が取得できる

paramsのハッシュ構造の違いによって、入力した情報の保存方法も変わる

[mergeメソッド]

mergeメソッドは2つのハッシュを統合する時に使うメソッド

hash1 = {question: "Who is your favorite artist?"}
hash2 = {group: "alulike", name: "taka"}
hash1.merge(hash2)
#=> {:question=>"Who is your favorite artist?", :group=>"alulike", :name=>"taka"}

ストロングパラメーターはpermitを用いているので取得できる

/reviews_controller.rb
def create_params
  params.require(:review).permit(:name, :rate, :review).merge(app_id: params[:app_id])
end
/reviews_controller.rb
Review.create(create_params)

[erb記法でRailsのオブジェクトの値をHTML内に入れるには]

<%= 変数 %> # Railsの変数をHTML内に埋め込む

[ActiveRecord Relationクラス]

whereメソッドやアソシエーションを利用してDBから複数のレコードをインスタンスとして取得した場合、取得した配列はActiveRecord Relationクラスに属する

apps = App.all
  apps.class #=> ActiveRecord::Relation::ActiveRecord_Relation_App

classメソッドを利用すると、利用したインスタンスが属するクラスを確認できる
これはあくまでも class というメソッド

[averageメソッド]

これもaverageメソッド →averageメソッドを利用するインスタンス取得先のテーブルのカラムをシンボル型で引数にとり、その値の平均を、小数点ありの状態で返す

athletes = Athlete.all
  athletes.average(:score)
  #=> 小数点まで含んだ平均点

[roundメソッド]

小数点ありの数字クラスのインスタンスが利用でき,利用した数字の小数点以下を四捨五入してくれる

10.4.round
  #=> 10

10.5.round
  #=> 11

[present?]

present?メソッドは、配列の中身が存在すればtrue、存在しなければfalseを返すメソッド
if文と組み合わせて使用する

  <% if app.reviews.present? %>
    <span class="rating-star">
      <i class="star-actived rate-<%= product.reviews.average(:rate).round %>0"></i>
    </span>
  <% else %>
    <span class="rating-star">
      <i class="star-actived rate-0"></i>
    </span>
  <% end %>

[レシーバ]

インスタンスメソッドを利用するインスタンス自身のこと

  str = "3"
  #以下の式のレシーバはstr
  str.to_i #=> 3

3行目の式におけるレシーバはstr

[self]

インスタンスメソッドの中でselfと書くと、そのメソッドを利用したレシーバ自身が代入された変数のように扱うことができる
Integerクラスに定義されているインスタンスメソッド、odd?を例にしてみるとする。
→odd?はレシーバが奇数かどうかを判定してtrueかfalseを返してくれるインスタンスメソッドのこと

  class Integer
    def odd?
      if self % 2 == 1
        return true
      else
        return false
      end
    end
  end
  2.odd? #=> false(%は剰余を求めるもので、余りが1ではないのでfalseが返ってくる)

[before_action]

全てのアクションが実行される前に指定したメソッドを呼び出すことができるもの

  class コントローラ名 < ApplicationController
    before_action :処理させたいメソッドの名前

before_actionの特徴
① before_actionを書いたコントローラのすべてのアクションの前に処理を行える
② before_actionを書いたコントローラで共通の処理を行える

[コントローラの継承]

コントローラは別のコントローラを継承することができる
 →元のコントローラの持つメソッドや特徴を引き継ぐことができる

class コントローラ < 継承元のコントローラ
end
class CatController < AnimalController
end
class AnimalController < ApplicationController
  before_action :say_hello

  def say_hello
    puts "Hello Animal"
  end
end

すると

例2
class CatController < AnimalController
  def show
    @cat = Cat.find(params[:id])
  end
end

# => showアクションの前にsay_helloが呼ばれる

これは、AnimalControllerを継承したCatControllerのすべてのアクションの前にもbefore_actionsay_helloメソッドが呼ばれます。

すべてのコントローラで共通のbefore_actionを定義したい場合はApplicationController記述するのは、
すべてのコントローラ(ApplicationController以外)がApplicationControllerを継承しているためである

[レイアウトファイル]

app/views/layouts/の下に入っているHTMLファイル
→URLにアクセスして対応するコントローラが呼ばれたあと、最初に表示されるHTMLのこと

[layout 'レイアウトファイル名']

コントローラ内でlayout 'レイアウトファイル名'と書くと、そのコントローラでのアクションが呼ばれたあと表示するビューのレイアウトファイルを指定できる

class GameController < ApplicationController
  layout 'game'

  def index
    @games = Game.all
  end
end

このように指定すると、GameControllerのindexアクションが呼ばれたときに表示されるレイアウトはgame.html.erbとなり、なにも指定しないとレイアウトファイルはapplication.html.erbとなる

[ <%= yield %> ]

外部のHTMLファイルを読み込むためのerb記法

[groupメソッド]

テーブルのレコードを指定したカラムでまとめることができるメソッド

モデル.group(カラム名)

[countメソッド]

groupメソッドに続けて使うとまとめられたそれぞれのレコードの数が取得できる

terminal
Review.group(:game_id).count
=> {21=>2, 22=>1, 23=>4}

game_idが21のレコードが2つ、game_idが22のレコードが1つ、game_idが23のレコードが4つということ

ソートにはorderメソッドを使う
理由は、モデル.group(カラム名).countは先ほど見たようにハッシュが返ってくるのでcountメソッドより前にorderメソッドを使う

terminal
Review.group(:game_id).order('count_game_id DESC').count(:game_id)
=> {23=>4, 21=>2, 22=>1}

[order('count_カラム名').count(カラム名)]

countメソッドの引数にカラム名を指定することができる、するとorderメソッドでcount_カラム名でのソートが可能となる。
→そのカラムを持つレコードの数でソートするという意味である
取得するのを10にするには

terminal
Review.group(:game_id).order('count_game_id DESC').limit(10).count(:game_id)
=> {23=>4, 21=>2, 22=>1}

[keysメソッド]

ハッシュはkeysというメソッドを持っている
→ハッシュのキーだけを取り出して配列として返すメソッド

terminai
Review.group(:game_id).order('count_game_id DESC').limit(10).count(:game_id).keys
=> [23, 21, 22]

これで、game_idの配列を投稿数が多い順に取得できる

[mapメソッド]

配列オブジェクトのインスタンスメソッド
→配列の中身を1つずつ取り出してブロックという構文を繰り返し実行する

配列オブジェクト.map {|ele| ブロックの処理}
  # eleには配列の要素が1つずつ代入される
  # ブロックの処理は配列の要素の数だけ繰り返し実行される
  numbers = [3, 3, 10]
  squares = numbers.map {|number| number * number}
  p squares
  => [9, 36, 100]

配列numbersの各値が二乗された数値が配列squaresに代入される

Appsテーブルからレコードを取得するのは以下のような方法になる

terminal
  ids = [3, 1, 2] # Appsテーブルのidの配列
  apps = ids.map {|app_id| Appsテーブルからidapp_idのレコードを取得する}

[after_sign_out_path_forメソッド]

deviseでサインアウトしたあとのリダイレクト先を指定するメソッド
返り値にサインアウト後のリダイレクト先URLを指定し,deiviseのメソッドを上書きしている関係上resourceを引数に渡さなけらばならないので、resourceを引数に渡す

application_controller.rb
  def after_sign_out_path_for(resource)
    '???' # サインアウト後のリダイレクト先URL
  end

[authenticate_user!]

deviseをインストールすると、ログイン画面とサインアップ画面を自動で用意してくれる
このメソッドは、deviseをインストールすることで使えるメソッドである

ユーザーがログインしているかどうかを確認し、ログインしていない場合はログインページにリダイレクトする
before_actionを合わせて使用するのが通常
before_actionexceptや``onlyオプションを組み合わせると特定のアクションを指定することもできる

[ImageMagick]

コマンドラインから簡単に画像の保存形式の変更などが行えるツール

••gem listコマンドでインストールされているgemの一覧が見れる、その後、
User.rbの最後に、追記→has_one_attached :avatarを加えることで、ユーザーのレコードと画像を紐付けできる

[devise_parameter_sanitizer]

deviseで設定されているstrong_parametersに対してパラメーターを追加することができる

devise_parameter_sanitizer.permit(追加したいメソッドの種類, keys: [追加したいパラメーター名])

指定する引数は2種類あり、1つ目が「StrongParametersを追加したい処理の種類」

引数の値 処理
:sign_up 新規登録時
:sign_in ログイン時
:account_update レコードの更新時

2つ目の引数には追加したいパラメーター名を渡す、複数の場合

 devise_parameter_sanitizer.permit(追加したいメソッドの種類, keys: [:パラメーター1, :パラメーター2,..])

このメソッドは、メソッドはbefore_actionに設定する
記述するのはDeviseのコントローラを継承したコントローラかもしくはApplicationControllerにする

application_controller.rb
before_action :メソッド名
application_controller.rb
  before_action :configure_permitted_parameters, if: :devise_controller?

  def configure_permitted_parameters
    # devise_parameter_sanitizerメソッドを呼び出す
  end

ifというオプションを指定するのは、before_actionを呼び出す条件を指定するもの

[validation(検証)]

入力フォームを通じてビューからサーバー側へパラメーターが送られてきた際、正常な値か検証することができる機能

[validates :カラム名, presence: true]

フォームの中身があるかないかを検出し、無い場合は保存を実行しない

もし、userのe-mailががないなら

/user.rb
class User < ApplicationRecord
    validates :email, presence: true

[placeholder: '']

フォームの中に、''で囲んだ文字をフォームの値が空の時に薄く表示しておくことができる

sample.html.erb
 <%= f.text_field :nickname, placeholder: 'ニックネームを入力(必須)' %>

[image_tag]

image_tagは、htmlのタグを生成するヘルパーメソッド
引数に文字列で画像ファイルのパスを取る

sample.html.erb
<%= image_tag "image/sample.jpg" %> #=> <img src="image/sample.jpg">
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0