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

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

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

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

Q&A

解決済

1回答

4562閲覧

【Rails5】セレクトボックスの記法について

ssk

総合スコア332

Ruby on Rails

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

0グッド

0クリップ

投稿2017/11/25 01:49

###前提・実現したいこと
DBのUsersテーブルにlastnamefirstnameのカラムがあります。
両方を連結してセレクトボックスを生成したいです。

html

1<select id="Participant" class="form-control" multiple="mutiple" name="▲▲▲"> 2<option value="ユーザーID">鈴木 太郎</option> 3<option value="ユーザーID">佐藤 兼</option> 4<option value="ユーザーID">小林 綾</option> 5678</select>

###発生している問題・エラーメッセージ
以下のコードの{}, {}の箇所が余計な気がしています。
何か他にスマートに書ける良い実装方法を知っている方がいましたら、教えてください。

###該当のソースコード

ruby

1<%= select :schedules, :ids, {}, {}, { id: 'Participant', class: 'form-control', multiple: true } do %> 2 <% User.all.select('id, lastname, firstname').each do |user| -%> 3 <%= content_tag(:option, user.lastname + " " + user.firstname, value: user.id) %> 4 <% end %> 5<% end %>

###補足情報(言語/FW/ツール等のバージョンなど)
Rails (5.1.2)

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

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

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

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

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

guest

回答1

0

ベストアンサー

モデルに、名前を結合させた文字列を返すメソッドを新規に定義してあげるといいのかもしれません
View 側ではそれを使うだけで、View の中ではモデルのメソッドを直接扱わずに済みます(自身の役割を超えない)

※手抜きのために form_tagselect_tag などを使っていること ご容赦ください
必要に応じて form_for 内で扱えるメソッドに置き換えてみてください

前提/準備

sh

1# ... プロジェクトの新規作成など済ませる... 2rails g scaffold user first_name:string last_name:string 3# ...DB の用意やデータ流し込みなど記載省略...

モデルとビューに追記してみる

# app/models/user.rb class User < ApplicationRecord def full_name "#{first_name} #{last_name}" end end

slim

1/ View(※好みでERB ではなくSlim) 2/ app/views/users/index.html.slim 3= form_tag 4 = select_tag :user_name_list, options_from_collection_for_select(@users, :id, :full_name), multiple: true

出力結果(<select/> のみ):

html

1<select name="user_name_list[]" id="user_name_list" multiple="multiple"> 2 <option value="1">name0 last_name</option> 3 <option value="2">name1 last_name</option> 4 <option value="3">name2 last_name</option> 5 <option value="4">name3 last_name</option> 6 <option value="5">name4 last_name</option> 7 <option value="6">name5 last_name</option> 8 <option value="7">name6 last_name</option> 9 <option value="8">name7 last_name</option> 10 <option value="9">name8 last_name</option> 11 <option value="10">name9 last_name</option> 12</select>

コントローラでのパラメータ:

ruby

1# app/controllers/users_controller.rb 2params 3# => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"...", 4# "user_name_list"=>["8", "9"], "commit"=>"submit", 5# "controller"=>"users", "action"=>"create"} permitted: ...>

簡単に書いてみましたが、何か参考になれば幸いです

Links

投稿2017/11/25 14:50

gouf

総合スコア2321

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

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

ssk

2017/11/29 11:20

ご回答、誠にありがとうございます。 options_from_collection_for_select(@users, :id, :full_name) ↑こちらのコードが目から鱗でした。 悩んでいたことが解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問