Open CarbazochromeT opened 1 year ago
こちらの記事が参考になるかもしれないので共有しますね。 https://qiita.com/k-mashi/items/ecff1a2a693d21db5fb1
渡していただいた記事を参考に、コードを組ませていただきましたが、indexメソッドのところでエラーが発生してしまいます。 ArgumentErrorが発生してしまうようです。 検索結果が行き渡っている時にだけ、formulationの配列の中身を数値にしたいのですが、どうすればいいでしょうか?
2023-10-19T22:55:39.873680+00:00 app[web.1]: I, [2023-10-19T22:55:39.873534 #6] INFO -- : [e84c1002-90a3-4f4c-88aa-ae06d8a9f7b3] Started GET "/drugs" for 133.201.8.65 at 2023-10-19 22:55:39 +0000
2023-10-19T22:55:39.918413+00:00 app[web.1]: I, [2023-10-19T22:55:39.918316 #6] INFO -- : [e84c1002-90a3-4f4c-88aa-ae06d8a9f7b3] Processing by DrugsController#index as HTML
2023-10-19T22:55:40.008662+00:00 app[web.1]: I, [2023-10-19T22:55:40.008588 #6] INFO -- : [e84c1002-90a3-4f4c-88aa-ae06d8a9f7b3] Completed 500 Internal Server Error in 90ms (ActiveRecord: 33.5ms | Allocations: 32169)
2023-10-19T22:55:40.009163+00:00 app[web.1]: F, [2023-10-19T22:55:40.009122 #6] FATAL -- : [e84c1002-90a3-4f4c-88aa-ae06d8a9f7b3]
2023-10-19T22:55:40.009176+00:00 app[web.1]: [e84c1002-90a3-4f4c-88aa-ae06d8a9f7b3] ArgumentError (wrong number of arguments (given 1, expected 0)):
2023-10-19T22:55:40.009177+00:00 app[web.1]: [e84c1002-90a3-4f4c-88aa-ae06d8a9f7b3]
2023-10-19T22:55:40.009177+00:00 app[web.1]: [e84c1002-90a3-4f4c-88aa-ae06d8a9f7b3] app/controllers/drugs_controller.rb:14:in `index'
2023-10-19T22:55:40.010285+00:00 heroku[router]: at=info method=GET path="/drugs" host=care-drug-searcher-7c69759f70d9.herokuapp.com request_id=e84c1002-90a3-4f4c-88aa-ae06d8a9f7b3 fwd="133.201.8.65" dyno=web.1 connect=0ms service=149ms status=500 byte
drugs_controller.rb
class DrugsController < ApplicationController
skip_before_action :require_login
before_action :set_drug, only: [:show, :edit]
def index
@q = Drug.ransack(params[:q])
@drugs = @q.result(distinct: true).includes(:symptoms, :ingredients, :maker_name)
.select('drugs.*', 'count(ingredients.id) AS ingredients')
.left_joins(:ingredients)
.group('drugs.id')
.order('ingredients ASC')
.page(params[:page]).per(10)
if @q.result.present?
@drugs.update(params(formulation_params))
end
render :index
end
〜〜〜
private
def set_drug
@drug = Drug.find(params[:id])
end
def drugs_params
params.require(:drugs).permit(:id, :drug, :name, :effect_text, :usage, :document_url, {formulation: []}, :division, :taxation, { symptom_ids: [] }, { ingredient_ids: [] }, :drive,:tobacco, :alcohol, :maker_names)
end
def search_params
params[:q]&.permit(:id, :drug, :name, :effect_text, :usage, :document_url, {formulation: []}, :division, :taxation, { symptom_ids: [] }, { ingredient_ids: [] }, :drive,:tobacco, :alcohol, :maker_names)
end
def formulation_params
params.permit({formulation: []})
end
def params_int(formulation_params)
formulation_params.each do |key, value|
if integer_string?(value)
formulation[key] = value.to_i
end
end
end
end
私の方では、こちらのコードを追記いたしました。 urlがgetの状態でupdateを使うのがいけないのでしょうか?
if @q.result.present?
@drugs.update(params(formulation_params))
end
他のコードはこちらです。
apprication_controller.rb
class ApplicationController < ActionController::Base
add_flash_types :success, :info, :warning, :danger
before_action :require_login
private
def not_authenticated
redirect_to login_path, danger: "ログインしてください"
end
def integer_string?(str)
Integer(str)
true
rescue ArgumentError
false
end
end
indexメソッドのところでエラーが発生してしまいます。 こちらindexアクションがよばれた時にエラーが起こっているのか、render indexでレンダリングをしている時(そこまでの処理は通常に行われている)エラーが発生しているのかどちらか検討つきそうでしょうか?
こちらでupdateの内容を書き足した後にエラーが発生したため、indexアクション内でのエラーで間違いないと思います。 html.erbの内容を書き足す前は正常に動いておりました。
def index
@q = Drug.ransack(params[:q])
@drugs = @q.result(distinct: true).includes(:symptoms, :ingredients, :maker_name)
.select('drugs.*', 'count(ingredients.id) AS ingredients')
.left_joins(:ingredients)
.group('drugs.id')
.order('ingredients ASC')
.page(params[:page]).per(10)
render :index
end
こちらがエラーが起こる前のdrugs_controller.erbの中身です。
ありがとうございます。
def params_int(formulation_params)
こちらのメソッドを呼び出している箇所が見当たらないのですが、どこかで呼び出していますでしょうか?(見逃していたらすみません。)
すみません、呼び出していませんでした。
そもそも数値に変換することができるはずなのに変換できないということは、Ransackの方で勝手に文字列変換されてしまっていることが原因な気がしてきました。
irb(main):032:1* def integer_string?(str)
irb(main):033:1* Integer(str)
irb(main):034:1* true
irb(main):035:1* rescue ArgumentError
irb(main):036:1* false
irb(main):037:0> end
=> :integer_string?
irb(main):031:0> integer_string?(drug.formulation.value)
=> true
irb(main):030:0> Drug.formulation.values.map { |v| [v.text, v.value] }.to_h
=>
{"錠剤"=>0,
"散剤"=>1,
"カプセル"=>2,
"液剤"=>3,
"点鼻"=>4,
"トローチ"=>5,
"飴"=>6,
"うがい液"=>7,
"軟膏"=>8,
"坐薬"=>9,
"のどスプレー"=>10}
irb(main):013:0> Drug.ransack(formulation_eq_any: 1).result.to_sql
=> "SELECT \"drugs\".* FROM \"drugs\" WHERE (\"drugs\".\"formulation\" = 1)"
formulation_in_anyにしたら無事に出てくるようになりました!
<dt>剤型にこだわりはありますか?</dt>
<dd>
<ul class= "search-list">
<%= f.collection_check_boxes :formulation_in_any, Drug.formulation.values.map { |v| [v.text, v.value] }.to_h, :last, :first , { multiple: true } do |b| %>
<li>
<label class="CheckboxInput">
<%= b.check_box(class: "CheckboxInput-Input") %>
<span class="CheckboxInput-DummyInput"></span>
<%= b.label(class: "CheckboxInput-LabelText") %>
</label>
</li>
<% end %>
</ul>
</dd>
MySQLからPostgreSQLに移行後、今まで起こり得なかったデータでエラーが発生するようになってしまったので、質問させてください。
herokuにデプロイしたこちらのサイトで、Ransackを用いた検索フォームを使用しております。
https://care-drug-searcher-7c69759f70d9.herokuapp.com/drugs
herokuアプリ上で剤型にチェックマークを押して検索ボタンを押すと、エラーが発生してしまいます。 なお、症状にチェックマークを押した場合は、問題なく結果が出てくるようになっております。
おそらくPostgresで、
drugs.formulation = 0
のように配列の中身が数値になっていないがためにエラーが発生しているのだと思われます。 MySQLの時は、特に数値になっているかは聞かれなかったため、問題なく検索結果が表示されていました。関連コード
_search.html.erb
schema.rb
drug.rb
試したこと
postgresにログインし、キャスト変換を行いました。 https://qiita.com/6in/items/f23ead1314b9e6d2f2b7
その後、チェックボックスの値で数字に出てくるように変更しました。
パラメーターの値は文字列のままで、エラーが発生してしまいます。
"formulation_eq_any"=>["", "0"],
その後のto_hで配列にするところでまた文字列に変換されているのがいけないのでしょうか。 どなたかアドバイスをお願い致します。