

**編集前**

[code]

    <% @songs.each do |song| %>           
        <div class="col-md-4 col-sm-6 portfolio-item">       
            <div class="portfolio-caption">           
                <h4 class="aaa"><%= link_to song.title, song %><br></h4>      
            </div>
        </div>
    
[/code]

この中では使えている`<%= link_to song.title, song %>`のtitleメソッドが

**編集後**

[code]

    <%= link_to ＠songs.title, song %>  ←これを追加するとエラーが出る
    <% @songs.each do |song| %>           
        <div class="col-md-4 col-sm-6 portfolio-item">       
            <div class="portfolio-caption">           
                <h4 class="aaa"><%= link_to song.title, song %><br></h4>      
            </div>
        </div>         
    <% end %>
    
[/code]

このようにすると下記二つのエラーが出るのですが、なぜでしょうか？

[code]

    undefined method `title' for <Song::ActiveRecord_Relation:------>
    
[/code]

[code]

    titleメソッドが定義されていません
    
[/code]

* * *

↓song.controller

[code]

      class SongsController < ApplicationController
      before_action :set_song, only: [:show, :edit, :update, :destroy]
      before_action :authenticate_user!, except: [:index, :show]
      # GET /songs
      # GET /songs.json
      def index
         if params[:user_id]
          @user = User.find(params[:user_id])
          @songs = @user.songs.order(:cached_votes_up => :desc)
         else
          @songs = Song.all.order(:cached_votes_up => :desc)
         end
      end
    
[/code]


CC BY-SA 4.0
2017-10-20T03:36:11.513
38888
2020-07-25T07:12:59.593
2019-08-29T01:37:59.087
3060
25055
question
ruby-on-rails ruby
同じコードでも、一つはエラーが出て、もう一つはエラーが出ないのはなぜですか？


@豚吐露 さんのコメントからのまとめ

  1. ＠が全角です。  
※ そもそも全角なら違うエラーのはずなので、打ち間違いと思われます。

  2. `@songs`はSongモデルではなく、Song::ActiveRecord_Relation(SQLの発行結果であるモデルの集合体)です。集合体なので、`title`というメソッドは存在しません。`title`はモデルとして取り出してから使わなくてはなりません。。  
例えると、`['abc',
'cdf'].upcase`としようとしているようなものです。集合体は集合体として扱う必要があって、その中身へメソッドを飛ばしてくれるような忖度はしてくれません。


CC BY-SA 4.0
2020-07-25T07:12:59.593
68939
2020-07-25T07:12:59.593
7347
38888
answer