###概要
Rails で顧客管理システムをつくっています。
customer#indexに顧客一覧が表示され、詳細に進むと、
customer#showで顧客詳細ページが表示されます。
cusutomer_controller.rb class CustomersController < ApplicationController before_action :authenticate_user!, only: [:new, :create, :edit, :update, :destroy] before_action :set_customer, only: [:show, :edit, :destroy, :update] 〜省略〜 def show @comment = Comment.new #@comments = Comment.where(customer_id: params[:id].to_i) @comments = @customer.comments end 〜省略〜 private def set_customer @customer = Customer.find(params[:id]) end def customer_params params.require(:customer).permit( :family_name, :given_name, :email, :company_id, :post_id ) end end
###今回やりたいこと:顧客詳細ページ(show)、対応履歴の管理を追加。
対応履歴の追加は、詳細ページ内にform_forメソッドを埋め込み
@commentモデルオブジェクトに追加し、comment#createに投げています。
詳細ページ内、<h2>対応履歴</h2>以下にeachメソッドで、
@commentからデータを受け取り、追加したコメントを表示しています。
ここまでは問題ありません。
customer/show.html.erb <div class="row"> <div class="col-lg-12"> <h1>顧客詳細</h1> <dl> <dt>お名前</dt> <dd style="margin:0px 0px 10px 20px"><%= @customer.full_name %></dd> ~省略~ <hr /> <h2>対応履歴</h2> <% @comments.each do |comment| %> <div class="media"> <div class="media-body"> <%= simple_format(comment.body) %> <p class="text-muted"> 投稿記事:<%= comment.created_at.strftime('%Y%m%d %H:%M') %> <%= link_to "削除する", comment_path(comment), method: :delete %> </p> </div> </div> <% end %> <%= form_for(@comment, url: { controller: :comments, action: :create}) do |f| %> <div class="form-group"> <%= f.label :body, '対応内容' %> <%= f.text_area :body, class: "form-control" %> </div> <%= f.hidden_field :customer_id, value: @customer.id %> <%= f.submit class: "btn btn-default" %> <% end %> </div> </div>
routes.rb Rails.application.routes.draw do 〜省略〜 resources :comments, only: [:create, :destroy] post '/comments' => 'comments#create' end
comments_controller.rb class CommentsController < ApplicationController ~省略~ def create @comment = Comment.new(comment_params) if @comment.save redirect_to customer_path(@comment.customer_id) else render template: "customers/show" end end ~省略~ end
##エラーと再現手順
今回、対応履歴の追加の際に、200文字上限のバリデーションを追加しました。
comment.rb class Comment < ActiveRecord::Base belongs_to :customer validates :body, presence: true, length: { maximum: 200 } validates :customer_id, presence: true end
文字数超過の場合には、エラーメッセージを詳細ページで表示したかったため、
comments#createで、elesにrender templateメソッドを使い、
遷移先をcustomers/showとしています。
この状態で、Webサーバを立ち上げ、ブラウザから、詳細ページにて
対応履歴を200文字以上入力し、登録すると以下のエラー画面が表示され、
手詰まりとなっています。。
<エラー画面> Showing /home/ubuntu/workspace/elites-crm02/app/views/customers/show.html.erb where line #6 raised: undefined method `full_name' for nil:NilClass Extracted source (around line #6): <dt>お名前</dt> <dd style="margin:0px 0px 10px 20px"><%= @customer.full_name %></dd> <dt>電子メール</dt> <dd style="margin:0px 0px 10px 20px"><%= @customer.email %></dd> <dt>会社名</dt> Rails.root: /home/ubuntu/workspace/elites-crm02 Application Trace | Framework Trace | Full Trace app/views/customers/show.html.erb:6:in `_app_views_customers_show_html_erb___3504510312829596345_37028060' app/controllers/comments_controller.rb:16:in `create'
該当のfull_nameメソッドは、customerモデルで定義しており、
通常のcustomers#showで表示する際には問題ありません。
customer.rb class Customer < ActiveRecord::Base belongs_to :company belongs_to :post has_many :comments 〜省略〜 def full_name family_name + given_name end end
###試したこと
NilClassというものについて、ネットで調べ、comments#showで、
@customerが定義されていないことが原因かと思い、
@cutomer = Customer.all
などをcomment#showに入れてみましたがうまく行きませんでした。
commentsコントローラーで@customerを定義できていないのが原因な気がしますが、
自力では解決できず、ご教示いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/17 21:12