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

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

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

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

2091閲覧

Rails バリデーション>elseの場合、render template メソッドでのエラー undefined method `◯◯' for nil:NilClass

yy-ymsht

総合スコア16

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/12/07 03:14

###概要
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を定義できていないのが原因な気がしますが、
自力では解決できず、ご教示いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

@customerが定義されていないことが原因かと思い

だと思いますし、Customer.all じゃなくて Customer.find 的なインスタンスが必要かと。
CommentsControllerがどうなってるか分かりませんが、
Customerに対してのコメントなら @customer を取得しておくべきかと。

ruby

1before_action :set_customer 2 3def set_customer 4 @customer = Customer.find params[:customer_id] # ? 5end

投稿2016/12/09 04:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yy-ymsht

2016/12/17 21:12

tanyzz様 遅くなりすみません! やはりコントローラーで@customerが取得できていないんですね! やってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問