ruby on rails - How would I display the department_name rather than the department_id? -
i learning ror , trying setup association between user model , department model. currently, able choose department dropdown field , save it. however, when showing user or presenting user in list, department shows id number , not department name. cant figure out doing wrong. appreciated!
here models:
class user < activerecord::base belongs_to :departments end class department < activerecord::base has_many :users end here controllers:
class userscontroller < applicationcontroller before_action :logged_in_user, only: [:edit, :update, :destroy] before_action :admin_user, only: [:index, :destroy] def new @user = user.new end def create @user = user.new(user_params) if @user.save log_in @user flash[:success] = "account created!" redirect_to root_path else render 'new' end end def index @filterrific = initialize_filterrific( user, params[:filterrific], select_options: { sorted_by_name: user.options_for_name, department_select: department.options_for_select }, ) or return @users = @filterrific.find.page(params[:page]) respond_to |format| format.html format.js end end def show @user = user.find(params[:id]) end def edit @user = user.find(params[:id]) end def update @user = user.find(params[:id]) if @user.update_attributes(user_params) flash[:success] = "profile updated." redirect_to edit_user_path else render 'edit' end end def destroy user.find(params[:id]).destroy flash[:success] = "user deleted." redirect_to users_url end private def user_params params.require(:user).permit(:name, :email, :work_phone, :department, :cell_phone, :password, :password_confirmation) end # before filters def logged_in_user unless logged_in? store_location flash[:danger] = "please log in first." redirect_to login_url end end # confirms admin user. def admin_user redirect_to(root_url) unless current_user.admin? end end class departmentscontroller < applicationcontroller def create @department = department.new(department_params) if @department.save redirect_to(:action => 'index') else render 'new' end end def index @department = department.all end def show @department = department.find(params[:id]) end def edit @department = department.find(params[:id]) end def update @department = department.find(params[:id]) end def delete @department = department.find(params[:id]) end def destroy department.find(params[:id]).destroy redirect_to(:action => 'index') end private def department_params params.require(:department).permit(:name, :department_ids => []) end end my edit html:
<% provide(:title, "edit user") %> <h1>update profile</h1> <div class="row"> <div class="col-md-6 col-md-offset-3"> <%= form_for(@user) |f| %> <%= f.label :name, class: 'form-spacing' %> <div class="input-group"> <%= f.text_field :name, class: 'form-control' %> <span class="input-group-addon" id="basic-addon2"> <span class="glyphicon glyphicon-user"></span> </span> </div> <%= f.label :email, class: 'form-spacing' %> <div class="input-group"> <%= f.email_field :email, class: 'form-control' %> <span class="input-group-addon" id="basic-addon2"> <span class="glyphicon glyphicon-envelope"></span> </span> </div> <%= f.label :work_phone, class: 'form-spacing' %> <div class="input-group"> <%= f.text_field :work_phone, class: 'form-control' %> <span class="input-group-addon" id="basic-addon2"> <span class="glyphicon glyphicon-phone"></span> </span> </div> <%= f.label :cell_phone, class: 'form-spacing' %> <div class="input-group"> <%= f.text_field :cell_phone, class: 'form-control' %> <span class="input-group-addon" id="basic-addon2"> <span class="glyphicon glyphicon-phone"></span> </span> </div> <%= f.label :department, class: 'form-spacing' %> <div class="input-group"> <div class="input-group-btn"> <%= f.collection_select :department, department.order(:name), :id, :name, {}, {class: 'form-control'} %> </div> </div> <%= f.label :password, class: 'form-spacing' %> <%= f.password_field :password, class: 'form-control' %> <%= f.label :password_confirmation, "confirmation", class: 'form-spacing' %> <%= f.password_field :password_confirmation, class: 'form-control' %> <%= f.submit "save changes", class: "btn btn-primary center-block btn-margin" %> <% end %> </div> </div> list html:
<div class="row well-sm"> <div class="col-lg-6"> <div id="filterrific_results"> <div> <%= page_entries_info users %><%= render_filterrific_spinner %> </div> </div> </div> <div class="pull-right"> <%= link_to 'reset', reset_filterrific_url, class: "btn btn-default" %> </div> </div> <table class="table table-condensed"> <tr> <th>profile</th> <th>name</th> <th>email</th> <th>work #</th> <th>cell #</th> <th>department</th> </tr> <% users.each |user| %> <tr> <td><%= link_to user_path(user.id), class: "btn btn-xs" %> <i class="glyphicon glyphicon-user"></i> <% end %> </td> <td><%= link_to(user.name, edit_user_path(user)) %></td> <td><%= user.email %></td> <td><%= user.work_phone %></td> <td><%= user.cell_phone %></td> <td><%= user.department %></td> </tr> <% end %> </table> <%= will_paginate users %> here trace receive when trying use user.department.name:
nomethoderror in users#index showing c:/users/ngkuligoski/desktop/workspace/tgna_app/app/views/users/_list.html.erb line #33 raised: undefined method `name' "30":string trace of template inclusion: app/views/users/index.html.erb rails.root: c:/users/ngkuligoski/desktop/workspace/tgna_app application trace | framework trace | full trace app/views/users/_list.html.erb:33:in `block in _app_views_users__list_html_erb___81315648_98180820' app/views/users/_list.html.erb:23:in `_app_views_users__list_html_erb___81315648_98180820' app/views/users/index.html.erb:39:in `_app_views_users_index_html_erb___1258199830_74038920' app/controllers/users_controller.rb:33:in `index' when switching belongs_to :department instead of belongs_to :departments, following error:
activerecord::associationtypemismatch in userscontroller#update department(#70215520847100) expected, got string(#70215501520980) extracted source (around line #49): 47: def update 48: @user = user.find(params[:id]) 49: if @user.update_attributes(user_params) 50: flash[:success] = "profile updated." 51: redirect_to edit_user_path 52: else rails.root: /users/nkuligoski/desktop/tgna_app application trace | framework trace | full trace app/controllers/users_controller.rb:49:in `update' after removing :department user.params, not receive error when submitting form. however, recieving following error @ list view , getting "unpermitted parameter: department" error feedback sql.
nomethoderror in users#index showing /users/nkuligoski/desktop/tgna_app/app/views/users/_list.html.erb line #33 raised: undefined method `name' nil:nilclass extracted source (around line #33): 31 <td><%= user.work_phone %></td> 32 <td><%= user.cell_phone %></td> 33 <td><%= user.department.name %></td> 34 </tr> 35 <% end %> 36 </table> trace of template inclusion: app/views/users/index.html.erb rails.root: /users/nkuligoski/desktop/tgna_app application trace | framework trace | full trace app/views/users/_list.html.erb:33:in `block in _app_views_users__list_html_erb__2838324632886829267_70215593187400' app/views/users/_list.html.erb:23:in `_app_views_users__list_html_erb__2838324632886829267_70215593187400' app/views/users/index.html.erb:39:in `_app_views_users_index_html_erb___3592670951755992954_70215580220040' app/controllers/users_controller.rb:33:in `index'
try belongs_to :department instead of belongs_to :departments inside user class.
Comments
Post a Comment