前提・実現したいこと
DBより抽出したデータをrailsにて処理する際に、格納されているデータは配列なのかハッシュなのかが分からない為、適切なメソッドを利用出来ない。
また、配列であると確認出来た際に、配列に用いるメソッドを使用しても、そのメソッドに期待された結果が帰ってこない理由が分かりません...。
今回のケースでは、配列の要素を取り出すメソッドを使用した際になぜか配列まで取り出して表示されてしまっている・・どうしてこうなってしまったのか。
発生している問題・エラーメッセージ
@members
配列に格納されている:name
の値を抽出したいが、現状のコードでは
ruby
1おじいさん [#<Student id: 1, name: "おじいさん", grade: 3, content: "山に住んでいます", created_at: "2018-08-31 03:55:30", updated_at: "2018-08-31 03:55:30", bukatu_id: 1>]
member.name
でname:
の値が取れたに思われたが、その後に配列そのものまで出力する結果になってしまっている
該当のソースコード
bukatucontrollerrb
1class BukatusController < ApplicationController 2 3 def index 4 @bukatus = Bukatu.all 5 end 6 7 def show 8 @bukatu = Bukatu.find(params[:id]) 9 @members = @bukatu.students 10 end 11 12end 13
studentscontrollerrb
1class StudentsController < ApplicationController 2 3 def show 4 @student = Student.find(params[:id]) 5 end 6 7 def new 8 end 9 10 def create 11 @student = Student.new(student_params) 12 if @student.save 13 flash[:notice] = "登録出来ました!" 14 redirect_to @student 15 else 16 flash[:notice] = "再度入力し直して下さい!" 17 redirect_to new_student_path 18 end 19 end 20 21 private 22 def student_params 23 params.require(:student).permit(:name, :grade, :content, :bukatu_id) 24 end 25 26end
bukaturb
1class Bukatu < ApplicationRecord 2 has_many :students 3end
studentrb
1class Student < ApplicationRecord 2 belongs_to :bukatu 3 validates :name,presence: true 4 validates :grade,presence: true 5 validates :content,presence: true 6 7end
showhtmlerb
1<h1>部員一覧</h1> 2<%= @bukatu.name %><br> 3<%= @members.each do |member| %> 4<%= member.name %> 5<% end %> 6<% console %> 7
試したこと
web_console
にてそれぞれの変数が何を格納しているのかを確認
ruby
1>> @members 2=> #<ActiveRecord::Associations::CollectionProxy [#<Student id: 1, name: "おじいさん", grade: 3, content: "山に住んでいます", created_at: "2018-08-31 03:55:30", updated_at: "2018-08-31 03:55:30", bukatu_id: 1>]>
show.html.erb
にてループで取り出している処理を直接記述すると異なる結果が帰ってくる。別のモデルの.name
の結果が帰ってきている為,@memberの帰属先を参照することに
ruby
1>> @members.name 2=> "Student"
ruby
1>> @members.class 2=> Student::ActiveRecord_Associations_CollectionProxy
ActiveRecord_Associations_CollectionProxy
という謎の参照先が見つかったのでArray
メソッドは用いれないと判断。というのも
ruby
1>> @members.id 2NoMethodError: undefined method `id' for #<Student::ActiveRecord_Associations_CollectionProxy:0x00007fef0611bd98>
同じく格納されている:id
を.id
とした結果が.name
と異なりエラーを吐くからだ。そこで
ruby
1>> @members.target 2=> [#<Student id: 1, name: "おじいさん", grade: 3, content: "山に住んでいます", created_at: "2018-08-31 03:55:30", updated_at: "2018-08-31 03:55:30", bukatu_id: 1>] 3>> @members.target.class 4=> Array
.target
を付けた所Array
クラスに変わったので中身を確認。これで格納されている先は配列だと断定。
ruby
1>> @members.target.select { |x| x == name } 2NameError: undefined local variable or method `name' for #<#<Class:0x00007fef006e9fc8>:0x00007fef006e7e58>
select
メソッドを用いて該当するkey
から値を抽出しようと試みるもエラー
ruby
1>> @members.target.assoc(:name) 2=> nil
.assoc
メソッドを用いて同じことを試すもエラー。また
ruby
1>> @members.target.find(:name) 2=> #<Enumerator: [#<Student id: 1, name: "おじいさん", grade: 3, content: "山に住んでいます", created_at: "2018-08-31 03:55:30", updated_at: "2018-08-31 03:55:30", bukatu_id: 1>]:find(:name)>
find
メソッドを用いると先頭に<Enumerator:
が出現し、結局name:
の値を取り出すことは叶わず。
ruby
1>> @members[:name] 2TypeError: no implicit conversion of Symbol into Integer
仮に保存されている形式がhash
と仮定して、値を抜き取ってもシンボルを数値に変換できないと予想外のエラー。
補足情報(FW/ツールのバージョンなど)
Rails.5.2.0

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/01 05:46