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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2191閲覧

select multipleで一つのデータしか保存されない

punchan36

総合スコア105

Ruby on Rails 5

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/05/19 03:45

編集2020/05/21 12:02

前提・実現したいこと

Railsでユーザーのプロフィール編集画面を作っています。
セレクトボックスのmultiple属性に「multiple」を指定する事で、複数の選択肢を同時に選択できるようにしました。

しかし保存後にプロフィール画面に行くと、最後に選択した項目しか表示されません。
(日本語のみを選択した場合は日本語が保存。日本語、英語、中国語の順で選択した場合は中国語のみが保存されると言った具合です。)
エラーメッセージは特別表示されません。ユーザーが選んだ全ての言語を保存、表示できるようにさせたいです。

views/users/edit.html.erb

rails

1 <li> 2 <div class="col-1">Spoken language:</div> 3 <div class="col-2"> 4 <select name="language" multiple="multiple"> 5 <option>日本語</option> 6 <option>英語</option> 7 <option>中国語</option> 8 <option>スペイン語</option> 9 </div> 10 </li>

controllers/users_controller.rb

ruby

1 def update 2 @user = User.find_by(id: params[:id]) 3 @user.language = params[:language] 4 if @user.save 5 flash[:notice] = "ユーザー情報を編集しました" 6 redirect_to("/users/#{@user.id}") 7 else 8 render("users/edit") 9 end 10 end

views/users/show.html.erb

rails

1 <div class="language"><%= @user.language %></div>

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

ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3

追記 models/user.rb

ruby

1class User < ApplicationRecord 2 has_secure_password 3 has_many :languages, through: :user_language 4 has_many :user_language 5 6 def language_name 7 ::LanguageSelect::LANGUAGES[language] 8 end 9end

models/language.rb

ruby

1class Language < ApplicationRecord 2 has_many :users, through: :user_language 3 has_many :user_language 4end

models/user_language.rb

ruby

1class Language < ApplicationRecord 2 belongs_to :user 3 belongs_to :language 4end

db/schema.rb

ruby

1ActiveRecord::Schema.define(version: 2020_05_21_034306) do 2 3 create_table "languages", force: :cascade do |t| 4 t.string "description" 5 t.boolean "done" 6 t.integer "user_id" 7 t.datetime "created_at", null: false 8 t.datetime "updated_at", null: false 9 t.index ["user_id"], name: "index_languages_on_user_id" 10 end 11 12 create_table "user_languages", force: :cascade do |t| 13 t.integer "user_id" 14 t.integer "language_id" 15 t.datetime "created_at", null: false 16 t.datetime "updated_at", null: false 17 t.index ["language_id"], name: "index_user_languages_on_language_id" 18 t.index ["user_id"], name: "index_user_languages_on_user_id" 19 end 20 21 create_table "users", force: :cascade do |t| 22 t.string "name" 23 t.string "email" 24 t.datetime "created_at", null: false 25 t.datetime "updated_at", null: false 26 t.string "image_name" 27 t.string "password_digest" 28 t.string "cover_image_name" 29 t.string "sex" 30 t.string "country" 31 t.string "language" 32 t.text "introduction" 33 end 34 35end

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

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

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

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

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

guest

回答1

0

ベストアンサー

viewの問題は<select name="language[]" multiple="multiple">
でなおりますが、問題はmodelの設計にもありそうです。
@user.language = params[:language] この式をみるとそんな懸念。

Userの定義を載せてください。

投稿2020/05/19 20:42

winterboum

総合スコア23569

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

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

punchan36

2020/05/20 03:17

有難うございます! 大分行き詰っていたので本当に有難いです。 追記にuserのモデルの「language」に関係している部分、及びlanguageモデルの記述を追記致しました。 複数の言語を選べるよう、has_manyとbelongs_toの記述はしております…。
winterboum

2020/05/20 05:05

この定義ですと、LanguageとUserを多対多でつないているのではなく、 1対多で、Languageに言語がなにか、も記録するということですね
punchan36

2020/05/21 04:49

有難うございます!UserとLanguageの間に中間テーブルを定義する事で、複数の言語を選択・表示する事が出来ました。 ただやはり表示する際に、["日本語", "中国語"]のように配列の形のまま出力されます。日本語 中国語 のように各々個別に取得する方法はないでしょうか。 <% @users.each do |user| %> <div><%= user.language %></div> <% end %> このように記述しても思ったように動きませんでした…。
winterboum

2020/05/21 05:37

ただやはり表示する際に、["日本語", "中国語"]のように配列の形のまま出力されます。 この部分viewにどのように書いてありますか
punchan36

2020/05/21 06:27

<div class="language"><%= @user.language %></div> この記述で書きますと、["日本語", "中国語"]の表示になりました。
winterboum

2020/05/21 06:36

@user.languages でなく @user.language で表示されるのが不思議なのですが、、、、 @user.language.join(' ') でどうでしょう もしくは @user.language.each do |lang| でloopして表示させるか、です
punchan36

2020/05/21 10:53 編集

頂いたアドバイスに沿って試行錯誤してみたのですが、 <div class><%= @user.language.join(' ') %></div>に置き換えた場合 NoMethodError in Users#show undefined method `join' for "[\"日本語\", \"中国語\"]":String のエラー文が表示され、 <% @user.language.each do |lang| %> <div><%= lang.user.language %></div> <% end %> こちらでも NoMethodError in Users#show undefined method `each' for "[\"日本語\", \"中国語\"]":String のエラー文が表示されてしまいます。。
winterboum

2020/05/21 11:20

データが多対多で入っていないように思える。 多分文字列 '["日本語", "中国語"]' で入ってますね has_many :languages なのに@user.language = params[:language]と単数で受けている。また  params[:language] をいきなり代入している。paramsから Language のインスタンスを求めていない。 params[:language]が配列 ["日本語", "中国語"]で来ているのを stringな項目に入れているという感じ。 Userのtable構成見せてください
punchan36

2020/05/21 12:07

本当に有難うございます! 多対多で複数のデータを受け取る際のコントローラの記述がよく理解できておらず、苦戦しております。申し訳ありません。schema.rbの関連部分と、中間テーブルの記述も追記致しました。 長い事八方塞がりが続いておりますので、打開出来ると有難いです。。
punchan36

2020/05/24 13:36

まだ解決はしておりませんが、原因が多対多の記述の部分にありそうだと目星がつきました。 解決しましたら追記致します。有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問