🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 3

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

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Q&A

解決済

1回答

667閲覧

acts_as_list: undefined method `first?` for #<TodoItem:0x00007f70fd34cba8>

qfgdg233

総合スコア5

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 3

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

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

0グッド

0クリップ

投稿2019/12/12 06:12

編集2019/12/12 07:04

概要

Rails3で作られたアプリをRails5にアップグレードしています。

その過程でact_as_listを最新版の1.0.0にしたのですが、インスタンスメソッドのfirst?に未定義メソッドエラーが発生しました。

エラー内容

acts_as_list: undefined method 'first?' for #<TodoItem:0x00007f70fd34cba8>

試したこと

最初first?メソッドのレシーバとなるクラスがRails3とRails5間で変わったため、メソッドが効かなくなったと考え、新旧バージョンのレシーバのクラスを見たのですが、差異はありませんでした。(下記に示すToDoItemクラスです。)

かなりの時間このエラーの解消に費やしています...
わかりにくい質問で大変申し訳ございませんがご回答のほどよろしくお願いいたします。

該当コード

[コントローラ]

  • app/controllers/to_do_items_controller.rb

ruby

1class Admin::ToDoItemsController < ApplicationController 2 def index 3 @to_do_items = ToDoItem.order(:position).paginate(:page => params[:page]) 4 respond_to do |format| 5 format.html # index.html.erb 6 format.xml { render :xml => @to_do_items } 7 end 8 end 9 10(略)

[モデル]

  • app/models/to_do_item.rb

ruby

1require 'rss' 2class ToDoItem < ActiveRecord::Base 3 default_scope -> { order("position") } 4 belongs_to :to_do_list, :validate => true 5 6 validates_associated :to_do_list 7 8 acts_as_list 9 10(略)
  • app/models/to_do_list.rb

ruby

1class ToDoList < ActiveRecord::Base 2 has_many :to_do_item 3 4(略)

[ビュー]

  • app/views/to_do_items/index.html.erb

ruby

1<%- @to_do_items.each do |to_do_item| -%> 2 <tr class="line<%= cycle("0", "1") -%>"> 3 <td><%= move_position(to_do_item) -%></td> 4 <td><%= link_to h(to_do_item.title), admin_to_do_item_path(to_do_item) -%></td> 5 (略) 6 </tr> 7<%- end -%>
  • app/views/pages/_position.html.erb

ruby

1<%= object.first? ? image_tag('hoge.png', :size => '16x16') : image_tag('fuga.png') -%> 2 3(略)

[ヘルパー]

  • app/helpers/application_helper.rb

ruby

1module ApplicationHelper 2 def move_position(object) 3 render :partial => 'page/position', :locals => {:object => object} 4 end 5 6(略)

バージョン情報

Rails: 3.0.1 -> 5.2.0
Ruby: 1.8.7 -> 2.6.5
acts_as_list: 0.1.7 -> 1.0.0

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

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

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

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

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

winterboum

2019/12/12 06:21

エラーメッセージ省略しないで載せて下さい
qfgdg233

2019/12/12 06:27 編集

失礼しました。 以下の通りです ``` ActionView::Template::Error (und efined method `first?' for #<TodoItem:0x00007f70fd34cba8>): 1: <%= object.first? ? image_tag('hoge.png', :size => '16x16') : image_tag('fuga.png') -%> app/views/page/_position.html.er b:1:in `_app_views_page__position_html_erb___3826974176651821505_70061630591940' app/helpers/application_helper.rb:3:in `move_position' app/views/to_do_items/index.html.erb:16:in `block in _app_views_admin_news_ feeds_index_html_erb___4426503702372986007_70061630559000' app/views/to_do_items/index.html.erb:14:in `_app_views_to_do_items_ind ex_html_erb___4426503702372986007_70061630559000' ```
guest

回答1

0

ベストアンサー

Rails5では first? は ActionView::PartialIteration のmethodになっています。
Rails3ではActiveRecordにあった、 とも考えにくいので、#indexでのRelationから_position.html.erbに渡されるまでの過程でのclassの変化が3と5で変わったのかな?というのが仮説です。識者のご意見を。

@to_do_items.each_with_index do |to_do_item,idx| と逃げることにするか。

投稿2019/12/12 06:43

winterboum

総合スコア23567

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

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

qfgdg233

2019/12/12 06:57 編集

ありがとうございます! わざわざすみません! `@to_do_items.each_with_index do |to_do_item,idx|`で試してみたのですが、引き続き同じエラーにより動作しませんでした... 試しにapplication_helper.rbに ``` module ApplicationHelper def move_position(object) Rails.logger.debug "[upper]#{object.class}" render :partial => 'page/position', :locals => {:object => object} Rails.logger.debug "[lower]#{object.class}" end ``` のようにしてロガーを挟んだところどちらも`ToDoItem`クラスとしてログ出力されました。
winterboum

2019/12/12 07:07

いや、each_with_index  で逃げるというのは、first?を使わないように修正するという意味です。inxを引数に加えて、object.first? ではなく、 idx==0 で判断する
qfgdg233

2019/12/12 07:18 編集

ありがとうございます!! ご指摘の修正を施したところ、うまく動作しました! (idxは`move_position`ヘルパを拡張して_position.html.erbに渡しました。) とても助かります。 こんな迂回法があるとは...と感心しています。 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問