###前提・実現したいこと
Railsでデータの検索をする時にパラメーターを取得できず困っております。
リクナビやマイナビといった就職情報サイトの説明会を、複数サイトから説明会の開催時間も含めて検索できるサービスを作ろうと思っています。
検索の都度就職情報サイトにデータを取りに行くのではなく、事前に就職情報サイトをスクレイピングしてDBに保存してあるデータを検索します。
現在は企業情報や会社説明会といったデータはリクナビをスクレイピングしてある程度DBに保存してあります。
説明会のモデルBriefingSessionには
- 開催地 : location(varchar)
- 開催日 : bs_date(date)
- 開始時間 : start_time(time)
- 終了時間 : finish_time(time)
といったカラムがあります。()の中はデータ型です。
これらの日付や開催時間といったカラムから条件に合う説明会を検索をしようとしています。
検索フォームの実装やRuby on Railsで複数のモデルが絡む検索画面の作り方を参考にモデルに検索ロジックを作りました。
###発生している問題・エラーメッセージ
入力フォームから開催日をdate_select
、開始時間と終了時間をtime_select
で入力させたいのですが、入力してsubmitを押すと以下のエラーになります。
エラーメッセージ undefined method `start_time(1i)=' for #<BriefingSessionSearchForm:0x007fba91fe9e28> Parameters: {"utf8"=>"✓", "briefing_session_search_form"=>{"location"=>"東京都", "bs_date"=>"2016-12-02", "start_time(1i)"=>"2016", "start_time(2i)"=>"12", "start_time(3i)"=>"1", "start_time(4i)"=>"10", "start_time(5i)"=>"00", "finish_time"=>""}, "commit"=>"検索"} (start_timeだけtime_selectにしてあります)
###該当のソースコード
関係ありそうなファイルを載せます。
GitHubには全て上げてあります。
/app/controllers/briefing_sessions_controller.rb
lang
1class BriefingSessionsController < ApplicationController 2 def index 3 @search_form = BriefingSessionSearchForm.new 4 end 5 6 def search 7 @search_form = BriefingSessionSearchForm.new(search_params) 8 @bs_results = @search_form.matches 9 end 10 11 def show 12 @bs = BriefingSession.find(params[:id]) 13 end 14 15 private 16 def search_params 17 params.require(:briefing_session_search_form).permit(:location, :bs_date, :start_time, :finish_time) 18 end 19end
/app/views/briefing_sessions/index.html.erb
lang
1<h1>説明会検索</h1> 2 3<%= form_for(@search_form, url: :search_briefing_sessions, html: {method: :get}) do |f| %> 4 5 <%= f.label :location, "開催地" %> 6 <%= f.text_field :location %><br> 7 <%= f.label :bs_date, "開催日" %> 8 <%= f.date_field :bs_date, use_month_numbers: true, discard_year: true %><br> 9 <%= f.label :start_time, "開始時間" %> 10 <%= f.time_select :start_time %><br> 11 <%= f.label :finish_time, "終了時間" %> 12 <%= f.time_field :finish_time %><br> 13 14 <%= f.submit "検索" %> 15 16<% end %>
/app/forms/briefing_session_search_form.rb
lang
1class BriefingSessionSearchForm 2 include ActiveModel::Model 3 attr_accessor :location, :bs_date, :start_time, :finish_time 4 5 def matches 6 results = BriefingSession 7 results = results.where(location: location) if location.present? 8 results = results.where(bs_date: bs_date) if bs_date.present? 9 results = results.where(start_time: start_time) if start_time.present? 10 results = results.where(finish_time: finish_time) if finish_time.present? 11 12 results 13 end 14end
一応/app/models/briefing_session.rb
lang
1class BriefingSession < ActiveRecord::Base 2 belongs_to :company 3 has_many :briefing_session_urls, dependent: :destroy 4 has_many :urls, through: :briefing_session_urls, dependent: :destroy 5 6 validates :location, presence: true, length: { in: 2..12 } 7 validates :bs_date, presence: true 8 validates :start_time, presence: true 9 validates :finish_time, presence: true 10end
###試したこと
モデルにbs_date(1i)
やstart_time(1i)
といったアクセサが無いからだと予想したので~(1i)
といったアクセサを追加しようとしましたがエラーになります。
どうすればよいかが分かりません。
/app/forms/briefing_session_search_form.rb
lang
1REGISTRABLE_ATTRIBUTES = %i( 2 location 3 bs_date(1i) bs_date(2i) bs_date(3i) 4 start_time(1i) start_time(2i) start_time(3i) start_time(4i) start_time(5i) 5 finish_time(1i) finish_time(2i) finish_time(3i) finish_time(4i) finish_time(5i) 6 ) 7 8attr_accessor REGISTRABLE_ATTRIBUTES 9#=>[:location, :"bs_date(1i)", :"bs_date(2i)", :"bs_date(3i)", :"start_time(1i)", :"start_time(2i)", :"start_time(3i)", :"start_time(4i)", :"start_time(5i)", :start_time, :finish_time] is not a symbol nor a string
現状は説明会の開催地と開催日時でしか検索していませんが、開催する企業の業種や社員数、就職情報サイトの種類などでも検索できるようにするつもりです。
そのため検索条件が複雑になると思われるのですが、ransackでは複雑な検索は難しいと見かけたので、ransackは使わずにロジックを分けて実装したいです。
ですがそれはあくまで希望なので、実装することができたら他の方法でも構いません。
どなたか解決方法が分かる方いらっしゃったらどうかお願いいたします。
###補足情報(言語/FW/ツール等のバージョンなど)
- Mac OS X 10.11.6
- PostgreSQL 9.5.5
- Ruby 2.3.1
- Rails 4.2.7.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/01 17:12 編集