🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

検索

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

Q&A

解決済

1回答

4283閲覧

ユーザーが送信した値をラジオボタンの初期値に指定したい。

punchan36

総合スコア105

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

検索

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

0グッド

0クリップ

投稿2021/03/09 08:28

編集2021/03/09 13:11

前提・実現したいこと

ユーザー検索機能を実装しています。検索欄にはユーザー名(:name)、キーワード(:introducion、自己紹介欄の中身)、性別(:sex)があります。検索自体は上手く実装出来ています。
更に検索した後の検索欄にユーザーが入力した情報を残す為、以下のコードにて初期値を記述しました。

users/index.html.erb

<%= form_with url: users_path, method: :get, local: true do |f| %> <p>User name</p> <%= f.search_field :name, :value => params[:name] %> <p>Keyword</p> <%= f.search_field :introduction, :value => params[:introduction] %> <p>Gender</p> <%= f.radio_button :sex, "Male", :checked => true if params[:sex]&.include?("Male") %>Male <%= f.radio_button :sex, "Female", :checked => true if params[:sex]&.include?("Female") %>Female <%= f.submit :search, :class => "btn-square-little-rich" %> <% end %>

users_index.html.erb

def index if params[:name].present? || params[:introduction].present? || params[:sex].present? @users = User.where(['name LIKE ? AND introduction LIKE ? AND sex LIKE ?', "%#{params[:name]}%", "%#{params[:introduction]}%", "#{params[:sex]}%"]).page(params[:page]).per(20) else # ユーザーが何も入力しなかった場合。 @users = User.all.order(created_at: :desc).page(params[:page]).per(20) end if @users == [] # 該当のユーザーが存在しなかった場合。 @users = User.all.order(created_at: :desc).page(params[:page]).per(20) end end

ユーザー名、キーワードの部分は実装出来たのですが、性別のラジオボタンが上手く実装出来ません。
, :checked => true以降を記述する前は「〇Male 〇Female」の様に表示されていたのですが、if文を付け足す事で「Male Female」の様にラジオボタンの表示自体が消えてしまいました。

試したこと

以下の様なキーワードで調べてみたのですが、中々情報に辿り着けず質問させて頂きました。

「form_with radio_button 引数」、「rails radio_button checked if」、「rails radio_button 初期値 if」

どなたかご助言を頂けますと有難いです。

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

ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3

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

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

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

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

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

scivola

2021/03/09 10:03

form_with を使っていますか。そこのコードも略さず載せてください。 モデルオブジェクトが適切に扱えていれば,search_field の value オプションとか radio_button の checked オプションは書かなくても希望通りになると思うのですが。
punchan36

2021/03/09 10:59

失礼致しました。 form_withの内容と、念の為コントローラの中身も併せて追記致しました。 form_withの記述に問題点がありますでしょうか…?
guest

回答1

0

ベストアンサー

rb

1f.radio_button :sex, "Male", :checked => true if params[:sex]&.include?("Male")

の意図は,「params[:sex]&.include?("Male") が真だったら :checkedtrue を与える」ということですよね?
でもそういうふうになっていないんです。
上記のコードで,if 修飾子は true ではなく

rb

1f.radio_button :sex, "Male", :checked => true

全体にかかっています。
if 修飾子のついた式は,条件式の値が偽のとき,nil になる,というルールです。
以下のように:

rb

1x = ("foo" if false) 2p x # => nil

ですから,件のコードで条件式が偽のとき,<%= %> の中身が nil になります。
ERB で <%= %> は,中身が文字列化されて埋め込まれます。nil.to_s は空文字列なので,実質何も埋め込まれません。だからラジオボタンが表示されなかったのですね。

解決策ですが,

rb

1f.radio_button :sex, "Male", :checked => (true if params[:sex]&.include?("Male"))

のように ( ) で囲んでしまえば意図どおりになります。
しかし,これ,そもそも if 修飾子を使う必要がありませんね。:checked には真偽を与えればいいので,

rb

1f.radio_button :sex, "Male", :checked => params[:sex]&.include?("Male")

でいけるでしょう。

なお,判定がなぜ include?("Male") なのかはちょっと疑問ですが,それはまた別の話。

投稿2021/03/09 12:20

scivola

総合スコア2108

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

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

punchan36

2021/03/09 12:50

詳細に教えて頂き有難うございます! ご教示頂いたコードで希望通りの実装が出来ました。 出来れば自力で解決したかったのですが、ググり力に問題があるのか、基礎力の身に付け方が甘い・良くないのか… それとも単純に経験による部分もあるのでしょうか。。 > なお,判定がなぜ include?("Male") なのかはちょっと疑問ですが,それはまた別の話。 こちらは単純に == で判定すれば良いのでは、と言う事でしょうか。今気が付きました…。 <%= f.radio_button :sex, "Male", :checked => params[:sex] == ("Male") %>Male
scivola

2021/03/09 20:20

まず,ラジオボタンが消えた,というところから,<%= %> のところが空であることは確実ですよね。 f.radio_button が空文字列や nil を返すことってありうるのかな?とリファレンスで確認してもいいかもしれない。 今回の躓きポイントは if 修飾子のかかる範囲だったので,Ruby の構文規則がどのくらい把握できているか,という話ではありますね。 `==` の件はそのとおりです。
punchan36

2021/03/10 01:58

有難うございます。 仰るようにもう少し順序立てて考えていけるよう頑張ります。 御親切にご助言下さいまして、有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問