Rails Rep のソース解読忘備録-1

立教大シラバスのソースが公開されたので、読んで勉強する。 ソース公開してくださった。kent_earさんありがとう!

f:id:happy_teeth_ago:20180914165002p:plain

= form_tag(search_lesson_index_path, method: "get") do
  .row
//コノの2つが教授名 と授業内容 6.6で分割(Bootstrapの12グリッドシステム)
    .form-group.col-sm-6.col-xs-12
      = text_field_tag :name, params[:name], placeholder: "授業名/教授名", class: "form-control"
    .form-group.col-sm-6.col-xs-12
      = text_field_tag :content, params[:content], placeholder: "授業内容", class: "form-control"
  .row
//ここはその下の4つ 3で割って4つに分割してる。
    .form-group.col-sm-3.col-xs-6
      = select_tag 'year', options_for_select({"2017年度"=>"2017", "2018年度"=>"2018"}, {selected: params[:year] || '2018'}), include_blank: "年度", class: "form-control"
    .form-group.col-sm-3.col-xs-6
      = select_tag 'campus', options_for_select({"池袋"=>"1", "新座"=>"2", "その他"=>"3"}, {selected: params[:campus]}), include_blank: "キャンパス", class: "form-control"
    .form-group.col-sm-3.col-xs-6
      = select_tag('faculty_id', options_from_collection_for_select(Faculty.all, :id, :faculty_name, {selected: params[:faculty_id]}), prompt: "学部", class: "form-control")
    .form-group.col-sm-3.col-xs-6
      = render 'classes/lesson/departments', locals: {faculty_id: Faculty.first.id}
//以下割愛  
//検索ボタン
  .pull-right
    .form-group
      = submit_tag "検索", class: "btn btn-success btn-go", data: { disable_with: "送信中..." }, onClick: "gtag('event', 'click', {'event_category': 'lesson', 'event_label': 'search'});"
  .clearfix

form_tag(search_lesson_index_path, method: "get") do

form_tagの使い方基本

form_tag(リンク先 [オプション]) do
end

オプション :method HTTPメソッドを指定 :remote Ajaxでリンクを処理 remoteが指定されていないのでAjax処理では無い。

routingはこう

 resources :lesson, :module => :classes, :as => 'lesson' do
    collection do
      get :departments_select
      get :first_login
      get :search
      get :ml_api
    end

Railsのresources には index, show, new, edit, create, update, destroy の 7 つのデフォルトアクションが用意されています。 これ以外を呼ぶ場合は、member か collection を追加しなくてはいけない。

memberは特定のユーザーのアクション。例えば、Railsチュートリアルにuserをfollowする事があるが、そのときは、memberを利用する。 こんな感じ

  resources :users, only: [:show, :index, :destroy] do
    member do
      get :following, :followers
    end
end

urlはこうなる。

/users/1/follow

それに対して、collectionは全てに対するアクション。検索など。このRepでもコレクションが使われている。 urlはこうなる。

https://www.rep-rikkyo.com/lesson/search

このルーティングまで理解しておくのがWEBでは大切だと個人的には思います。 初めのurl 検索ボタン押下前

https://www.rep-rikkyo.com/

検索ボタン押下後

https://www.rep-rikkyo.com/lesson/search

viewファイル/lesson/seach

- unless amp_ready?
  = paginate @lessons
= render 'lessonmodule', lessons: @lessons, type: "#{controller_name}/#{action_name}"
- unless amp_ready?
  = paginate @lessons
- else
  .pT20.pB20.Amp__link
    | 検索結果の続きは
    = link_to "こちらから", "#{request.url.gsub('.amp', '')}"

こんな感じで、Viewが表示されていく。
結構デザインもシンプルで良いと思う。
f:id:happy_teeth_ago:20180914173346p:plain

lesson_controller

  def search
    @lessons = Lesson.lesson_module_includes.order(:lesson_name).all
    # 授業名と教授名をまとめて検索
    if params[:name].present?
      # 1文字以上の空白文字で区切る
      params[:name].split(/[[:blank:]]+/).each do |name|
        remove_word = name.match(/^[-ー](.+)/)
        @lessons = if remove_word.present?
                     @lessons.remove_word(remove_word[1], 'lesson_name').remove_word(remove_word[1], 'professor_name')
                   else
                     @lessons.get_by_name(name).or(@lessons.get_by_proname(name))
                   end
      end
    end

lesson_module_includesとは?モデルでスコープを決めている。

lesson.rb

scope :lesson_module_includes, -> { joins(:lesson_detail).includes(:evaluations).includes(:department).includes(:faculty).includes(:results) }

rails scopeとは、共通的に使うクエリをモデルのメソッドのように定義できる機能です。
モデルに記載します。
lesson_detailとはテーブル evaluationsもテーブル
それぞれを結合してから検索するみたい。 まとめて@lessonsに詰め込む

 create_table "lesson_details",
 create_table "evaluations",

lessonmoduleで各レッスンを出力している。