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

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

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

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

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

2回答

2128閲覧

ruby ransackを使ったor検索の実装 undefined method `negative?'の解釈

mktheobro

総合スコア0

Ruby

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

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2021/05/13 10:19

前提・実現したいこと

rubyのransackというGemを用いて、or検索を実装しようとしています。
下のような構造で行おうとしています。

ruby

1search 2┗base 3 ┣grouping 4 ┃ ┗condition 5 ┃ ┗condition 6 ┗grouping 7 ┣grouping 8 ┃┗condition 9 ┃┗condition 10 ┣grouping 11 ┃┗condition 12 ┃┗condition 13 ┗grouping 14 ┗condition 15 ┗condition

https://gyazo.com/b99408b06d3a45d0b1d9e3f788434b75

or検索には、アドバンストモードというのものを使えばいいというので、ビューファイルを記載し、
いざ、検索ボタンをクリックしたところ
エラーが発生しました。
解決の糸口でもご教授いただければ幸いです。

発生している問題・エラーメッセージ

NoMethodError in ProductsController#search undefined method `negative?' for nil:NilClass https://gyazo.com/7e1b30dd7b5cc503534e38acd67f3080

該当のソースコード

コントローラー

ruby

1class ProductsController < ApplicationController 2 3 before_action :search_product, only: [:index, :search] 4 5 def index 6 @products = Content.all 7 set_product_column 8 end 9 10 def search 11 @results = @p.result.to_sql 12 @results2 = @p.result.to_sql 13 end 14 15 private 16 17 def search_product 18 @p = Content.ransack(params[:q]) # 検索オブジェクトを生成 19 grouping = @p.build_grouping 20 grouping.build_condition 21 grouping1 = grouping.build_grouping 22 grouping1.build_condition 23 end 24 25 def set_product_column 26 @product_subject = Content.select("subject").distinct 27 end 28 29end

ビュー

ruby

1<h1> 2 一問一答 3</h1> 4<%= search_form_for @p, url: products_search_path do |f| %> 5 <%# グループ1 %> 6 <%= f.grouping_fields do |g| %> 7 <%# 問題文 %> 8 <%= g.label :question_cont, '問題文検索' %> 9 <%= g.condition_fields do |c| %> 10 <%= c.attribute_fields do |a| %> 11 <%= a.hidden_field :name, value: :question %> 12 <% end %> 13 <%= c.hidden_field :p, value: "cont" %> 14 <%= c.value_fields do |v| %> 15 <%= v.search_field :value %> 16 <% end %> 17 <% end %> 18 <br> 19 <%# 解答 %> 20 <%= g.label :question_cont, '解答検索' %> 21 <%= g.condition_fields do |c| %> 22 <%= c.attribute_fields do |a| %> 23 <%= a.hidden_field :name, value: :answer %> 24 <% end %> 25 <%= c.hidden_field :p, value: "cont" %> 26 <%= c.value_fields do |v| %> 27 <%= v.search_field :value %> 28 <% end %> 29 <% end %> 30 <% end %> 31 <br> 32 <%# グループ2 科目ごと %> 33 <%= f.grouping_fields do |g| %> 34 <%# グループ2-1 地理 %> 35 <%= g.grouping_fields do |g1| %> 36 <%= g1.label :subject_eq, '科目:' %> 37 <%= g1.condition_fields do |c| %> 38 <%= c.attribute_fields do |a| %> 39 <%= a.hidden_field :name, value: :subject %> 40 <% end %> 41 <%= c.hidden_field :p, value: "eq" %> 42 <%= c.value_fields do |v| %> 43 <%= v.collection_select :value, @product_subject, :subject, :subject %> 44 <% end %> 45 <% end %> 46 <%= g1.label :page, 'ページ:' %> 47 <%= g1.condition_fields do |c| %> 48 <%= c.attribute_fields do |a| %> 49 <%= a.hidden_field :name, value: :page %> 50 <% end %> 51 <%= c.hidden_field :p, value: "qteq" %> 52 <%= c.value_fields do |v| %> 53 <%= v.search_field :value %> 54 <% end %> 55 <% end %> 56 から 57 <%= g1.condition_fields do |c| %> 58 <%= c.attribute_fields do |a| %> 59 <%= a.hidden_field :name, value: :page %> 60 <% end %> 61 <%= c.hidden_field :p, value: "lt" %> 62 <%= c.value_fields do |v| %> 63 <%= v.search_field :value %> 64 <% end %> 65 <% end %> 66 まで 67 <% end %> 68 <br> 69 <%# グループ2-2 歴史 %> 70 <%= g.grouping_fields do |g1| %> 71 <%= g1.label :subject_eq, '科目:' %> 72 <%= g1.condition_fields do |c| %> 73 <%= c.attribute_fields do |a| %> 74 <%= a.hidden_field :name, value: :subject %> 75 <% end %> 76 <%= c.hidden_field :p, value: "eq" %> 77 <%= c.value_fields do |v| %> 78 <%= v.collection_select :value, @product_subject, :subject, :subject %> 79 <% end %> 80 <% end %> 81 <%= g1.label :page, 'ページ:' %> 82 <%= g1.condition_fields do |c| %> 83 <%= c.attribute_fields do |a| %> 84 <%= a.hidden_field :name, value: :page %> 85 <% end %> 86 <%= c.hidden_field :p, value: "qteq" %> 87 <%= c.value_fields do |v| %> 88 <%= v.search_field :value %> 89 <% end %> 90 <% end %> 91 から 92 <%= g1.condition_fields do |c| %> 93 <%= c.attribute_fields do |a| %> 94 <%= a.hidden_field :name, value: :page %> 95 <% end %> 96 <%= c.hidden_field :p, value: "lt" %> 97 <%= c.value_fields do |v| %> 98 <%= v.search_field :value %> 99 <% end %> 100 <% end %> 101 まで 102 <% end %> 103 <br> 104 <%# グループ2-3 公民 %> 105 <%= g.grouping_fields do |g1| %> 106 <%= g1.label :subject_eq, '科目:' %> 107 <%= g1.condition_fields do |c| %> 108 <%= c.attribute_fields do |a| %> 109 <%= a.hidden_field :name, value: :subject %> 110 <% end %> 111 <%= c.hidden_field :p, value: "eq" %> 112 <%= c.value_fields do |v| %> 113 <%= v.collection_select :value, @product_subject, :subject, :subject %> 114 <% end %> 115 <% end %> 116 <%= g1.label :page, 'ページ:' %> 117 <%= g1.condition_fields do |c| %> 118 <%= c.attribute_fields do |a| %> 119 <%= a.hidden_field :name, value: :page %> 120 <% end %> 121 <%= c.hidden_field :p, value: "qteq" %> 122 <%= c.value_fields do |v| %> 123 <%= v.search_field :value %> 124 <% end %> 125 <% end %> 126 から 127 <%= g1.condition_fields do |c| %> 128 <%= c.attribute_fields do |a| %> 129 <%= a.hidden_field :name, value: :page %> 130 <% end %> 131 <%= c.hidden_field :p, value: "lt" %> 132 <%= c.value_fields do |v| %> 133 <%= v.search_field :value %> 134 <% end %> 135 <% end %> 136 まで 137 <% end %> 138 <%# グループ2のOR検索の設定 %> 139 <%= g.hidden_field :m, value: "or" %> 140 <% end %> 141 <br> 142 <%= f.submit '検索' %> 143 <br> 144<% end %>

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

エラー文に記載されているparamsは以下の通りです。

ruby

1Parameters: 2 3{"q"=> 4 {"g"=> 5 {"0"=>{"c"=>{"0"=>{"a"=>{"0"=>{"name"=>"question"}}, "p"=>"cont", "v"=>{"0"=>{"value"=>"イギリス"}}}, "1"=>{"a"=>{"0"=>{"name"=>"answer"}}, "p"=>"cont", "v"=>{"0"=>{"value"=>"アメリカ"}}}}}, 6 "1"=> 7 {"g"=> 8 {"0"=> 9 {"c"=> 10 {"0"=>{"a"=>{"0"=>{"name"=>"subject"}}, "p"=>"eq", "v"=>{"0"=>{"value"=>"地理"}}}, 11 "1"=>{"a"=>{"0"=>{"name"=>"page"}}, "p"=>"qteq", "v"=>{"0"=>{"value"=>"121"}}}, 12 "2"=>{"a"=>{"0"=>{"name"=>"page"}}, "p"=>"lt", "v"=>{"0"=>{"value"=>"170"}}}}}, 13 "1"=> 14 {"c"=> 15 {"0"=>{"a"=>{"0"=>{"name"=>"subject"}}, "p"=>"eq", "v"=>{"0"=>{"value"=>"歴史"}}}, 16 "1"=>{"a"=>{"0"=>{"name"=>"page"}}, "p"=>"qteq", "v"=>{"0"=>{"value"=>"181"}}}, 17 "2"=>{"a"=>{"0"=>{"name"=>"page"}}, "p"=>"lt", "v"=>{"0"=>{"value"=>"200"}}}}}, 18 "2"=> 19 {"c"=> 20 {"0"=>{"a"=>{"0"=>{"name"=>"subject"}}, "p"=>"eq", "v"=>{"0"=>{"value"=>"公民"}}}, 21 "1"=>{"a"=>{"0"=>{"name"=>"page"}}, "p"=>"qteq", "v"=>{"0"=>{"value"=>"50"}}}, 22 "2"=>{"a"=>{"0"=>{"name"=>"page"}}, "p"=>"lt", "v"=>{"0"=>{"value"=>"300"}}}}}}, 23 "m"=>"or"}}}, 24 "commit"=>"検索"}

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

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

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

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

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

guest

回答2

0

paramsの構造が ransack に与える構造と全く異なるのが原因かもしれません。
ransackを極めてはいないので嘘を言ってるかもしれませんが、このような多層構造は無いのでは。
params[:q] の通常は
{ column名_検索条件: 検索に使う値 , ..... }
です。検索条件は eq とか cont とか

投稿2021/05/13 22:48

winterboum

総合スコア23349

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

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

0

undefined method 'negative?' for nil:NilClass
というのは
nil.negative?になっているという事ですが
エラー画面を見てもnegative?メソッドが見つからないのが問題ですね

Application Traceを見ても何が起こっているのか分からない時は
Framework TraceやFull Traceを見ると解決できる事があります。

投稿2021/05/13 17:23

asm

総合スコア15147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問