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

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

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

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

Ruby

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

Q&A

解決済

1回答

648閲覧

多対多において、コントローラでのデータの受け取り方が分からない

punchan36

総合スコア105

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2020/06/02 22:14

前提・実現したいこと

プロフィール編集画面で、ユーザーが複数の言語を選択出来るセレクトボックスを作成しました。
「ユーザー」と「言語」は多対多の関係にあると思いますので、「user_language」と言う中間テーブルを用い「user」と「language」を多対多の関係で結びました。

しかしコントローラの記述が良くないせいか、データを多対多として受け取ってくれません。
具体的には、表示する際に["日本語", "中国語"]のように配列の形のまま(文字列として?)出力されます。エラーメッセージは特別表示されません。
日本語 中国語のように、[]や""を含まない形でデータを個別に取り出し表示させたいです。

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>

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

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

ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

初めまして。
文字を表示させたいのは、views/users/show.html.erb ですか?
まず思ったのはuser.languages でないと描画されないと思うのと、
普通に配列をeachで回せば描画されるのでは?

投稿2020/06/14 05:59

tomoharu

総合スコア107

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

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

punchan36

2020/06/16 11:34

有難うございます。 はい、views/users/show.html.erbこのビューで文字を表示させています。 それは、コントローラは @user.languageで定義しつつ、ビューでは @user.languagesと記述すると言う事でしょうか? また、 <% @user.language.each do |language| %> <div><%= @user.language %></div> <% end %> このようにeachで記述を試みましたがエラーが表示されてしまいました…。
tomoharu

2020/06/28 08:45

コントローラー側で @languages = user.languagesにして、 @languagesをviewに渡して、 viewで@languages.each みたいな感じでいかがでしょう
punchan36

2020/08/14 10:11

有難うございます。まだ解決はしておりませんが、分かりましたら追記させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問