質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

6355閲覧

Rails4.2でフォームにdate_selectやtime_selectを使うとパラメーターが取得できない

kinchiki

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

1グッド

2クリップ

投稿2016/11/30 18:52

編集2016/11/30 18:56

###前提・実現したいこと
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
ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

解決方法はいくつかあるかもしれませんが、自前で変換してあげる例を1つ。

class BriefingSessionSearchForm def initialize(params = {}) if params.is_a?(ActionController::Parameters) [:start_time, :finish_time].each do |attribute| datetime_parts = (1..5).map { |i| params.delete("#{attribute}(#{i}i)") } params[attribute] = Time.zone.local(*datetime_parts) if datetime_parts.any? end end super end end

投稿2016/12/01 01:26

hana-da

総合スコア1728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kinchiki

2016/12/01 17:12 編集

ありがとうございます! 例を参考にしてこんな感じにしたら検索できるようになりました。 def initialize(params = {}) if params.is_a?(ActionController::Parameters) date_parts = (1..3).map { |i| params.delete("bs_date(#{i}i)") } params[:bs_date] = date_parts.join("-") if date_parts.any? [:start_time, :finish_time].each do |attribute| time_parts = (1..5).map { |i| params.delete("#{attribute}(#{i}i)") } params[attribute] = Time.zone.local(*time_parts).to_s(:time) if time_parts.any? end end super end 素早い回答本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問