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

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

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

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2896閲覧

Rails5でトップページに検索機能を実装したいです。

ssk

総合スコア332

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/05/08 15:01

###エラー文
イメージ説明

###コード

ruby

1#/app/models/base.rb 2class Search::Base 3 include ActiveModel::Model 4 include ActiveModel::Validations::Callbacks 5 6 def contains(arel_attribute, value) 7 arel_attribute.matches("%#{escape_like(value)}%") 8 end 9 10 def escape_like(string) 11 string.gsub(/[\\%_]/) { |m| "\\#{m}" } 12 end 13 14 def value_to_boolean(value) 15 ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value) 16 end 17end

ruby

1#/app/models/coordinator.rb 2class Search::Coordinator < Search::Base 3 ATTRIBUTES = %i( 4 id 5 name 6 name2 7 ) 8 attr_accessor(*ATTRIBUTES) 9 10 def matches 11 t = ::Product.arel_table 12 results = ::Product.all 13 results = results.where(contains(t[:code], code)) if code.present? 14 results = results.where(contains(t[:name], name)) if name.present? 15 results = results.where(contains(t[:name_kana], name_kana)) if name_kana.present? 16 results = results.where(t[:price].gteq(price_from)) if price_from.present? 17 results = results.where(t[:price].lteq(price_to)) if price_to.present? 18 if purchase_cost_from.present? 19 results = results.where(t[:purchase_cost].gteq(purchase_cost_from)) 20 end 21 if purchase_cost_to.present? 22 results = results.where(t[:purchase_cost].lteq(purchase_cost_to)) 23 end 24 results = results.where(availability: true) if value_to_boolean(availability) 25 results 26 end 27end

ruby

1#/app/controllers/coordinators_controller.rb 2def index 3 @coordinators = Coordinator.all 4 @search = Search::Coordinator.new 5 end 6 7 def search 8 @search = Search::Coordinator.new(search_params) 9 @search = @search 10 .matches 11 .order(availability: :desc, code: :asc) 12 .decorate 13 end 14 15 private 16 def search_params 17 params.require(:search_coordinator).permit(Search::Coordinator::ATTRIBUTES) 18 end

ruby

1<!--index.html.erb--> 2<%= form_for(@search, url: search_coordinators_path, html: { method: :get, class: 'form-horizontal', role: 'form' }) do |f| %> 3 <%= f.text_field :code, class: 'form-control' %> 4 <%= f.text_field :name, class: 'form-control' %> 5<% end %>

###参考にしたサイト
http://rails.densan-labs.net/form/search_form.html

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

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

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

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

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

guest

回答1

0

ベストアンサー

config/routes.rb
を開いて
get 'coordinators/search' => 'coordinators#search'

resoucese :coordinators
より上に追記してください。
これにより、coordinators#searchへのroute(アクセス許可と思ってください)
が生成され、search_coordinators_pathというmethodが生成されます。

ところで、現在、その次の項目に出てくる
Ransackが進化しすぎまして、いちいち
検索フォームオブジェクトを作る必要はほとんどありません。

ActiveModelという概念を学ぶには
検索フォームオブジェクトは素晴らしい練習になりますが
railsのversionによって、書き方が違う(より簡単になる)ので
rubyを理解していない初心者にはわかりにくいかもしれません。
Ransackだけで実装することをオススメします。

投稿2017/05/09 00:37

moke

総合スコア2241

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

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

ssk

2017/05/09 05:08

回答ありがとうございます。 rails初学者にも関わらず、少し難しいことにトライしていたようです、、 ransackを利用して検索を実装することにします。
moke

2017/05/09 05:26 編集

rails初学者というよりruby初学者ですね。 別言語なので。ActiveModelはrubyに近い書き方をします。 railsはrubyがわかっていなくてもある程度できてしまうので vba が使えなくてもexcelは使えるみたいな? ransackに関しては、一応、検索するモデルと検索のリクエストをかけるコントローラー が異なる時は注意が必要ですが、そこ以外はつまづくことはないと思います
ssk

2017/05/09 05:38

そうです。railsとrubyを同時に勉強しております。 mokeさんの回答は他にも派生してお答えくださるので非常に助かります。
moke

2017/05/09 06:32 編集

難しいルートを選んで、わからなくなったら 結局ここで質問することになるでしょうから たまに誤解して、明後日の話をすることがありますがw これがRuby on Railsの哲学です。 勉強頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問