やりたいこと
devise導入済みです。
①の記事では、userモデルのカラムを
deviseの新規登録画面に表示、登録できるようにしましたが、
今回は別モデルであるDepartment(部署)を登録したいです!
3時間程戦いました・・・。
departmentとuserの関係は、1:Nにしてます。
(userは1つの部署に所属。部署は複数のuserを持つ)
modelファイルにアソシエーション
ここら辺はなんてこと無く出来ました。
models/user.rb
belongs_to:department
models/department.rb
has_many:users, dependent: :destroy
マイグレーションファイル
class CreateDepartments < ActiveRecord::Migration[5.2]
def change
create_table :departments do |t|
t.string :name,null: false #表示名
t.string :correct_name #正式名称
t.timestamps
end
end
end
部署名は、会社によっては長くなりがちで、、あまり長いと厄介なので、
表示名と正式名称でカラムを分けました。
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
省略
t.integer :department_id,null:false
省略
department_idは外部キーです。
部署idを登録させる Applicationコントローラー
class ApplicationController < ActionController::Base
# ユーザー認証などが行われる前に、configure~が実行される
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
# デフォルトにないname/join_year/部署を追加しているので、それらを許可するよう記載している
devise_parameter_sanitizer.permit(:sign_up, keys: [:name,:join_year,:department_id])
end
end
ちゃんとdepartment_idを受け取って保存するように指示します。
新規登録画面に入力フォームを追加
<div class="form-group">
<%= f.label:"所属先" %><br />
<%= f.collection_select(:department_id, @departments, :id, :name, class: "form-control") %>
</div>
これで、完成!!!!だと思ってました...。
しかしこれだと@departmentsを渡せてないので、
undefined methodmap' for nil:NilClass
というエラーが出てきます。
どこに@departmentsの値を定義すれば・・・・?
@departmentsの値を定義する
controllers/users/registrations_controller.rb
に書きます!あることに気づかず、rails g devise:controllers usersをやってしまいました。
(無ければ、rails g devise:controllers usersで、コントローラー作れます)
class Users::RegistrationsController < Devise::RegistrationsController
# before_action :configure_sign_up_params, only: [:create]
# before_action :configure_account_update_params, only: [:update]
def new
@user = User.new
@departments = Department.all
end
省略
ルーティングを直す
上記のコントローラーを通過してビューを表示してほしいので、ルーティングを直します。
routes.rb
Rails.application.routes.draw do
devise_for :users, controllers: { registrations: 'users/registrations' }
# devise_for :users ←元々はコレだった
マイページでの部署の表示
users/show/html.erb
省略
<div style="text-align:center;"><%=link_to departments_path do %><%= user.department.name %><% end %></div>
<div style="text-align:center;"><%= user.name %></div>
省略
完成!
無事に部署の登録、マイページでの表示に成功しました!!
問題発生
このままだとおそらくデバイスのエラーメッセージが出力されないのではないかと思います・・・・
③の記事でエラー解消しています。
参考にさせていただいた記事
ありがとうございます!この記事のおかげでなんとか実装できました!