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

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

ただいまの
回答率

90.54%

  • Ruby on Rails 4

    2535questions

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

indexで呼び出せるメソッドがshowで呼び出せない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 437

innjera

score 114

indexメソッドでは@product.adviser.user.addressが機能するのですが、showメソッドではundefined method "address"が出てしまいます。

*正確には、indexメソッドではに以下にて呼び出しています。

<% @products.each do |p| %>
<%= p.adviser.user.address %>
<% end%>

原因わからず、誤りをご指摘頂けますと助かります。

#show.html.erb
<div class="container">
  <div class ="row">
    <div class="col-md-6">
      <p style="font-weight:bold;font-size:1.2rem;">
        場所:<%= @product.adviser.user.address %>
      </p>
    </div><!--col-->
  </div><!--row-->
</div><!--container -->

controllerは以下の通り記載しています。

  def index
    if params[:user_id]
      @user = User.find(params[:user_id])
      @adviser = @user.adviser
      @products = @adviser.products
    else
      @products = Product.all
    end
    @products = @products.page(params[:page])
  end

  def show
    @product = Product.find(params[:id])
  end

useradviserproductには以下のassociationを定義しています。

class User < ApplicationRecord
  has_one :adviser
end

class Adviser < ApplicationRecord
  belongs_to :user
  has_many :products
end

class Product < ApplicationRecord
  belongs_to :adviser
end

吐き出されているログは以下の通りです。

Started GET "/user/products/1" for ::1 at 2017-01-22 15:43:39 +0900
Processing by User::ProductsController#show as HTML
  Parameters: {"id"=>"1"}
  Product Load (0.3ms)  SELECT  "products".* FROM "products" WHERE "products"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  Rendering user/products/show.html.erb within layouts/user
  Adviser Load (0.2ms)  SELECT  "advisers".* FROM "advisers" WHERE "advisers"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  UserImage Load (4.3ms)  SELECT  "user_images".* FROM "user_images" WHERE "user_images"."user_id" = $1 LIMIT $2  [["user_id", 1], ["LIMIT", 1]]
   (0.4ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."product_id" = $1  [["product_id", 1]]
  Rendered user/products/show.html.erb within layouts/user (17.1ms)
Completed 500 Internal Server Error in 24ms (ActiveRecord: 5.4ms)



ActionView::Template::Error (undefined method `address' for nil:NilClass):

@product.adviser.user.addressからaddressを抜いた@product.adviser.userだと画面は表示されます(エラーは出ません)
ログは以下の通りです。

Started GET "/user/users/1.jpg" for ::1 at 2017-01-22 16:00:33 +0900
Processing by User::UsersController#show as JPEG
  Parameters: {"id"=>"1"}
  User Load (0.6ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  Adviser Load (0.7ms)  SELECT  "advisers".* FROM "advisers" WHERE "advisers"."user_id" = $1 LIMIT $2  [["user_id", 1], ["LIMIT", 1]]
  UserImage Load (11.0ms)  SELECT  "user_images".* FROM "user_images" WHERE "user_images"."user_id" = $1 LIMIT $2  [["user_id", 1], ["LIMIT", 1]]
  Rendering text template
  Rendered text template (0.0ms)
Sent data  (1.0ms)
Completed 200 OK in 24ms (Views: 0.8ms | ActiveRecord: 12.4ms)

addressが空で無いこと、確認取れております。

irb(main):008:0* product = Product.find(1)
  Product Load (0.5ms)  SELECT  "products".* FROM "products" WHERE "products"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> #<Product id: 1, adviser_id: 1, price: 2000, required_time: 1, title: "ファンデーションの基礎教えます", parts: "チーク", situation: "仕事", makeupkit: "自分の道具不要(アドバイザーの物を使用)", makeupkit_explain: "おすすめの道具等お教えします。", memo: "就職活動で重要な知的さと清楚さを第一印象として与える出すメイク教えます。で買いました。", place: "東京都内ならどこでも", place_memo: "山下公園のベンチを考えています。", posted_at: "2017-01-13 08:25:09", data: nil, created_at: "2017-01-22 08:25:09", updated_at: "2017-01-22 08:25:09", makeimg: nil, makeimgs: [], makeimg_two: nil, makeimg_three: nil>
irb(main):009:0> adviser = product.adviser
  Adviser Load (0.4ms)  SELECT  "advisers".* FROM "advisers" WHERE "advisers"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> #<Adviser id: 1, user_id: 1, profile: "109でショップ店員してます!ギャル風アイメイクが得意♩", occupation: nil, created_at: "2017-01-22 08:25:10", updated_at: "2017-01-22 08:25:10">
irb(main):010:0> user = adviser.user
  User Load (1.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> #<User id: 1, email: "yuu.sato@example.com", email_for_index: "yuu.sato@example.com", family_name: "佐藤", given_name: "悠", family_name_kana: "sato", given_name_kana: "yuu", user_name: "mitsuo", address: "栃木県", hashed_password: "$2a$10$h2IbGgkaimCUYM.G37RYQe88lDpZO6d4gQWHzicVQot...", start_date: "2016-10-14", end_date: nil, suspended: false, created_at: "2017-01-22 08:25:08", updated_at: "2017-01-22 08:25:08">
irb(main):011:0> user.address
=> "栃木県"

binding.pryの結果は以下の通りです。addressにしっかり入っていることが確認できました。

[1] pry(#<#<Class:0x007fdaa123d308>>)> p.adviser
=> #<Adviser:0x007fda9db9a878
 id: 1,
 user_id: 1,
 profile: "109でショップ店員してます!ギャル風アイメイクが得意♩",
 occupation: nil,
 created_at: Sun, 22 Jan 2017 17:25:10 JST +09:00,
 updated_at: Sun, 22 Jan 2017 17:25:10 JST +09:00>
[2] pry(#<#<Class:0x007fdaa123d308>>)> p.adviser.user
=> #<User:0x007fda9db32520
 id: 1,
 email: "yuu.sato@example.com",
 email_for_index: "yuu.sato@example.com",
 family_name: "佐藤",
 given_name: "悠",
 family_name_kana: "sato",
 given_name_kana: "yuu",
 user_name: "mitsuo",
 address: "栃木県",
 hashed_password:
  "$2a$10$h2IbGgkaimCUYM.G37RYQe88lDpZO6d4gQWHzicVQotx4gZ37bcS2",
 start_date: Fri, 14 Oct 2016,
 end_date: nil,
 suspended: false,
 created_at: Sun, 22 Jan 2017 17:25:08 JST +09:00,
 updated_at: Sun, 22 Jan 2017 17:25:08 JST +09:00>
[3] pry(#<#<Class:0x007fdaa123d308>>)> p.adviser.user.address
=> "栃木県"
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • innjera

    2017/01/24 15:33

    返信遅くなりました。いろいろとご指南有難う御座います!!その後、いろいろ試してみているのですが、未だ解決できず、もう少しtryします

    キャンセル

  • satoshih

    2017/01/27 13:57

    show の view を見せてもらうことは可能ですか?

    キャンセル

  • innjera

    2017/01/27 21:41

    コメント有難う御座います。show.html.erbを加えました。

    キャンセル

回答 2

check解決した方法

0

解決しました。

'@product.adviser.user.address'を'index.html.erb'で呼び出せ、'show.html.erb'で呼び出せなかったのは、単純にshow.html.erb内の該当コードの手前に'<% elsif @product.adviser.user == current_user%>'というコードを入れていたのですが、 比較演算式の'=='を誤って '='で代入してしまっていたことが原因でした。。。

'controller'の'showメッソッド'内にて'binding.pry'でデバックして'@product'に必要なデータが入っていたことから、気づきました。
質問に全てコードを記載して入れば、発見頂けていたと思います。

Maverick1211さん、satoshihさん、また見て頂いた方、有難う御座いました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

回答ではないですが、

質問のlogから

@product.adviser.user.address の場合
データベースへのアクセス順が(logを見る限り)
products ⇒ advisers ⇒ users ⇒ user_images ⇒ votes
なのに対して

@product.adviser.userの場合
users ⇒ advisers ⇒ user_images

の順に呼ばれていて、順番&参照されるテーブルが違うことが気になります。。。

検証する場合 @product.adviser.user.addressaddressが有る無し以外変更しないで行うといいと思います。
(質問に書かれてるlogはアクセスしているurlからして違うので。。。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/28 14:25

    ヒント有難う御座います。仰る通り、その点は私も気になっておりました、、そこに解決のヒントはあると思いますので、もう少し頑張って見ます。

    キャンセル

同じタグがついた質問を見る

  • Ruby on Rails 4

    2535questions

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