xmobileブログ

テスト運用開始

「未経験からエンジニア目指すならRailsかPHPどっち?」の議論について

RailsPHPどっち?」とか止めよう!

https://www.pakutaso.com/shared/img/thumb/kangoIMGL7874_TP_V.jpg

Twitterなどでも多くのエンジニアの方が言っていることですが、正直に言って意味の無い議論だとの意見が大半を占めます。

なぜなら、どちらも素晴らしいからです!

本記事では少し変わった視点からRails vs PHPの議論についてボソボソと語っていきます。

<筆者紹介>

私はプロゲートやドットインストールやプログラミングスクールでRubyRailsを教わりエンジニア転職を果たして現在はPHPで自社フレームワークで開発しながら帰宅後にPHPフレームワークであるLaravelを学んでいます。(遊んでいます)

1. フレームワークプログラミング言語

Railsフレームワーク
PHPプログラミング言語

前提として、RailsPHPを比較するのはおかしい!
それを加味した上で語って行くとしましょう。

2. 初学者はどちらから入ればいいか

結論から言いましょう!

「どっちでもいいわ!!」

これは筆者の体験談によるものなのですが、正直な話プログラミングスクールやプロゲートで得られる知識なんてものは実際に業務を行えば1月も掛かからずに身につきます。

私も「RubyRailsを学んだのに今からPHPやるのかよ〜」と思っていましたが、こんな低レベルな段階であれば取り戻すのなんて簡単です。

と言うより、一つの言語で一度何かを作る体験を経験できていれば、なんとなく学習の感覚もつかめているので途中で言語が変わろうが問題ありません。

3. 転職活動するなら

スタートアップなら「Ruby × Rail」
幅広転職なら「PHP × Laravel」

転職活動をする時に直ぐに気が付きますが、求人表の言語欄はPHPJavaが常連さんです。その反対にWontedly何かで自分でスタートアップの欄を見るとRubyRailsの文字が我が物顔で跋扈しております。

私が個人的におすすめする選択方法として年齢で選択するというものがあります。

例えば、学生や20代前半の方はRuby × Railsでスタートアップ転職を目指す。

反対に、20代後半や30代の方はPHPで幅広転職を狙いながら経験値を武器に転職活動をする。

などの考え方もあります。

4. 将来的にどちらが…

たまにRuby × RailsPHP × Laravelはどちらの方が勢いが合ってRailsはオワコンで…

なんて話をする人もいますが、よく考えて見て下さい。

<プログラミング言語年表(抜粋)>
1993年 Ruby 日本初のプログラミング言語。公開は1995年
1993年 Lua 高速な動作を特徴とするスクリプト言語
1995年 Delphi Pascalの血をひくWindows専用のGUIアプリ言語
1995年 Java 当初はウェブブラウザのアプレット開発言語
1995年 PHP/FI 後のPHP
1995年 JavaScript 開発当初はLiveScriptと呼ばれていた
1996年 SuperCollider 音響合成に特化したプログラミング言語
1996年 R言語 統計解析向けのプログラミング言語
1997年 ECMAScript JavaScriptの標準仕様。2002年にISO標準
1998年 Erlang 並行処理指向のプログラミング言語
2002年 C# C++Javaの中間的な言語
2003年 Scala オブジェクト指向言語関数型言語の特徴を統合
2007年 D言語 C言語の置き換えを目指して開発
2009年 Go言語 Google社のコンパイラ言語
2010年 Rust 大規模なサーバーなどのシステム構築が得意
2011年 Dart JavaScriptの代替を目的。2014年ECMA-408に登録
2011年 Kotlin 2017年5月にAndroidの開発言語として公式発表
2014年 Swift Apple社のiOSおよびOS Xのための言語
2014年 Hack PHPベースの言語

プログラミング言語の歴史はこんなにも長いんです。

そして今後もずっと変動し続けて行きます。
今からそんな事を考えていても意味はありません。

考えるとするのであれば、その言語を勉強して何ができるか。

そして実際にお金を稼ぐための案件はあるのかを考えてみましょう。

Rails初学者が「privateやparamsが分かんない」って時に見るコラム

:目次

1.privateってなに??
2.paramsってなに??
3.params.permit(:image, :text)ってなに??
4.redirect_toってなに??
5.action: :indexってなに??
6.unless unless user_signed_in?ってなに??


突然ですが問題です。
Ruby on Railsのコントローラーでこの様な記述がありました。

「では解説してみてください。」
class TestsController < ApplicationController
  before_action :move_to_index, except: :index 

  // 省略します  

  private

  def tests_params
    params.permit(:image, :text)
  end

  def move_to_index
     redirect_to action: :index unless user_signed_in?
  end

end

...できましたか?

もしできなければ以下を読んで大まかな捉え方を覚えましょう!多くの知識はどこかで繋がっているので知識の捉え方を覚えて仕舞えば今後の理解がサクサク進みます!

1. privateってなに??

これはprivateメソッドと言います。その名の通りプライベートなメソッドなのでprivate以下に書き込まれたメソッドはclassの中だけでしか呼び出せません。

どんな時に使うの?

はい、すごくよく使う場面は2点!

  • paramsを取得する時
  • before_actionする時

2. paramsってなに??

paramsはURLから送られて来た値やフォームから送られて来た値のパラメーターのことです!つまりブラウザを一度通して送られて来た値とも取れますね!

そしてprivate以下で記入されているということはclassの外で呼び出されて欲しくないものになります!

http://railsdoc.com/references/params

3. params.permit(:image, :text)ってなに??

def tests_params
  params.permit(:image, :text)
end

paramsの中からimagetextを取り出そうとしています。しかし、paramsとは外部から送られてくる値ですのでもしかしたら悪意を持った人がハッキングを仕掛けてくるかもしれません!

...と、そこまでではありませんがpermitを指定することで特定の値のみを取り出すことができます。

さらに!paramsに入った値は配列[ ]やハッシュ{ }に格納されるため:imageなどの様に:を先頭に付けることで取り出せます!٩( ᐛ )و

4. redirect_toってなに??

指定されたページへ飛ばすことができます!
基本的にはURLやPrefix(Path)を指定して飛ばしますが..

なんとRailsではaction指定で飛ばすことができるのです!!٩( ᐛ )و

http://railsdoc.com/references/redirect_to:rmbed

5. action: :indexってなに??

redirect_to action: :index

actionはコントローラのアクションです!
今回は同じコントローラ内のindexアクションを指定しているみたいですね!

ちなみに:を付けるか否かの思え方としてはaction:action =と考えるとイメージが近いと思います!

そして:indexはデータを探っていくと配列[ ]の中に入っていたのでこの形になっています!

6. unless user_signed_in?ってなに??

unlessとは「○○では無い」の条件分岐です!

redirect_to action: :index unless user_signed_in?

if文でごちゃごちゃ書くのが面倒なのでできたものですかね?きっとこのメソッドを作った人とは気が合いそうだ!٩( ᐛ )و

user_signed_in?とはかの有名なユーザー管理gemのdeviseさんが用意してくれているメソッドです!

文字の通りユーザーはログインしているかどうかを確認できます!もちろんログインしていればtrueで未ログインならfalseを返します。

そしてここでお得情報!
user_signed_in?deviseさえ入れればコントローラーでもビューでもどこでも使えちゃいます!

Rails初学者のための「このファイルなに?」をざっくり解説!!

Rails newしたらなんかファイルできてた!!

早速ですがこのファイルの意味をそれぞれ理解できていますか?

f:id:xmobile:20180312224644p:plain:w150

私がRails初学者の時はrails newをターミナルに打ち込んだ瞬間に思考停止してしまいました。

しかし、これらはなんら難しいものではありません。
まずは広く浅い知識をつけて今後の学習をより楽しくしていくための基礎知識を学んで行きましょう!

よく使う「ファイルorディレクトリ」一覧

※このファイルで大体の作業ができます。

  • appMVCとか色々入ってる)
    • assets
      (見た目cssや非同期js
    • controller
      (アクションdef indexインスタンス変数@user
    • helpers
      (controllerやmodleに書きたくないもの)
    • models
      (DBとの処理def befor_timeやアソシエーションhas_many
    • views
      (構造と文章html
  • config (設定)
    • routes.rb
      (ルーティングrake routesで見れるやつ)
  • db (データベース)
    • migrate
      rails g migrationでDBを作成するファイル)
    • schema.rb
      (作成・編集したDBの状態をみれる)
  • Gemfile
    Rails拡張機能
  • Gemfile.lock
    (ダウンロードしたgemの詳細)
  • README.md
    (説明書)

app(アプリケーション中核)

f:id:xmobile:20180312232931p:plain:w200

いわゆるMVCが詰まったディレクトリです。かなりの頻度でこの中のどれかを使ってアプリケーションを作成していくこととなります。

viewsディレクト

その中でもHTMLが書かれたviewsファイルは初心者でもとっつき易いのではないでしょうか?

特にRailsではlayouts以下のapplication.html.erbの様な大元 のファイルが用意されているので共通部分はここで定義します。

また、application.html.erbを大枠として<%= yield %>を用いて以下にそれぞれのhtmlが埋め込まれる形になります。

<!DOCTYPE html>
<html>
  <head>
    <title>テストです</title>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  </head>
  <body>
    <header class="header">
      <h1>テスト</h1>
    </header>

    <%= yield %><!-- ここに埋め込むファイルが入る-->

    <footer>
      <p>フッターです</p>
    </footer>
  </body>
</html>

assetsディレクト

みなさん大好き「見た目」と「非同期動作」です! ここではデザイナーさんやフロントエンドの方々が驚異の力を発揮します!たかがcssやjsくらいとなめてかかると痛い目を見ることでしょう(笑)

見た目のcssでは色や大きさといった指定ができます。

body {
  height: 200px;
  width: 120px;
  margin: 0 auto;
}

.header {
  height: 120px;
}

h1 {
  font-size: 16px;
  color: #ddd;
}

fotter {
  font-size: 11px;
  color: #fff;
}

そして非同期動作のJavaScliptでは最近流行りのぬるぬる動くあんなことやこんなことまでできます。(割愛)

$(function() {
  function buildHTML(comment){
    var html = `<p>
                  <strong>
                    <a href=${comment.id}>${comment.user_name}</a>
                    :
                  </strong>
                  ${comment.text}
                </p>`
    return html;
  }
  $('#new_comment').on('submit', function(e){
    e.preventDefault();
    var formData = new FormData(this);
    var url = $(this).atter('action')
    $.ajax({
      url: url,
      type: 'POST',
      data: formData,
      dataType: 'json',
      processData: false,
      contentType: false;
    })
    .done(fnction(data) {
      var html = buildHTM(data);
      $('.comments').append(html)
      $('.textbox').val('')
    })
    .fail(function() {
      alert('error');
    })
  });
});

controllersディレクト

ここでルーティングに従ったアクション(def indexなど)を定義することで、そのアクション名に対応したviewsファイルでインスタンス変数(@testsなど)を呼び出すことができ、htmlに変数の値を渡すことができるのです!

なお、privateparamsについては重要だけど今回は割愛!

class TestsController < ApplicationController
 //トップ
  def index
    @tests = Test.includes(:user).order("created_at DESC").page(params[:page]).per(5)
  end
 
  def new
  end
  //データをcreateする
  def create
    Test.create(fp[image: test_params[:image], text: tests_params[:text], user_id: current_user.id)
  end
  //データを消す
  def destroy
    test = Test.find(params[:id])
    test.destroy if test.user_id == current_user.id
  end

  //ここ以下はプライベートメソッド(外からは呼び出せない)
  private
  // viewsから取得したparamsを正しい形で取得する。
  def tweets_params
    params.permit(:image, :text)
  end
end

modelsディレクト

アプリケーションとデータベースを繋ぐ役割を持っています。そのためDBのテーブル同士の関係を繋ぐアソシエーション(1対多の関係など)もここで定義します。

そのほか、DBに密接し様々な場面で用いるメソッドもmodelsで定義します。今回はタグ付けと検索機能をmodelsで定義している例です。

class Test < ApplicationRecord

  has_many :test, dependent: :destroy
  belongs_to :user
 
  # タグ付け
  acts_as_taggable

  # 検索機能
  def self.search(key)
    if key
      Test.where(['test LIKE ?', "%#{key}%"])
    else
      Test.all
    end
  end

end

route.rbファイル

ここではパスを定義している訳なのですが、連動してcontrollerのアクションやviewsを定義していると考えると楽です!

そしてRailsさんはresourcesというエンジニアをダメにするツールを備え付けてくれているので楽々ですよね!でも一応Pathは自分で書ける様になっておいてくださいね〜

Rails.application.routes.draw do
  // deviseはログイン確認時に一番先に読まれるから一番上に書いとけ!
  devise_for :users
  root 'tests#index'
  resources :tests do
    resources :comments, only: [:create]
  end
  resources :users, only: [:show]
end

migrateディレクト

データベースのテーブル作りのためのファイルです!すごく奥が深く私も「設計」のをまだ修めていないので思った様に書いていますが本来はユーザーからどの様な値を与えられるかを考えて堅牢で正確なシステムを作る要となります。

「エンジニアのやらかしは大体データベース!!」

              某PHPエンジニア様より

class CreateTests < ActiveRecord::Migration
  def change
    create_table :tests do |t|
      t.string    :name
      t.text      :text
      t.text      :image
      t.timestamps
    end
  end
end