Rails Rep のソース解読忘備録-1
立教大シラバスのソースが公開されたので、読んで勉強する。 ソース公開してくださった。kent_earさんありがとう!
= 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が表示されていく。
結構デザインもシンプルで良いと思う。
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で各レッスンを出力している。