前提・実現したいこと
プロフィール編集画面で、ユーザーが複数の言語を選択出来るセレクトボックスを作成しました。
「ユーザー」と「言語」は多対多の関係にあると思いますので、「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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/16 11:34
2020/06/28 08:45
2020/08/14 10:11
2020/10/23 07:28