2016-09-19 3 views
0

私は、モデルクラス内にActiveRecordを作成して保存しなければならない割り当てをしようとしています。 rspecはこれを確認するためにfind_byメソッドを使用する予定です。 ------------オブジェクトのActiveRecordメソッド(find_by)が見つかりません

-----------------------

class User < ActiveRecord::Base 
attr_accessor :id, :username, :password_digest, :created_at, :updated_at 
after_initialize :add_user 

def initialize(attributes={}) 
    @username = attributes[:username] 
    @password_digest = attributes[:password_digest] 
    super 
end 

def add_user 
    self[:username] = @username 
    self[:password_digest] = @password_digest 
    self.save 
    self[:id] = self.id 
end 
end 

:ここに私のモデルです----

User.new(params)を実行すると、レコードは実際にはDBに正しく格納されます。しかし、返されたオブジェクトにはfind_byメソッドがありません。したがって、rspecは失敗します。私はどこでも見てきましたが、解決策を見つけることができません。私はノブですので、答えが明白であり、私がそれを見ることができない場合、ごめんなさい。私はUser.new(のparams)を行う場合

+0

失敗したRSpecの例とエラーメッセージを表示してください。 – Stefan

+1

ActiveRecordオブジェクトには 'find_by'メソッドがありません。' find_by'はクラスメソッドです。 RSpecテストを表示できますか? – SteveTurczyn

+0

これはかなり奇妙なコードです。たとえば、User.newにレコードを保存させることは非常に珍しいことです。 –

答えて

0

あなたは

を言って、レコードが実際にDBに適切に保存されています。しかし、返されたオブジェクトのfind_byメソッドがありません

これは予期した動作です。うまくいけば、クラスメソッドとインスタンスメソッドの違いを理解することができます。主な重要な点は、find_byなどのクエリメソッドはモデルインスタンスで使用できないということです。 user = User.find_by(id: params[:id])のような操作を行う場合は、Userモデルのfind_byクラスメソッドを呼び出しています。

ActiveRecord::QueryMethodsで定義されているなどwhereorderlimit、のような多くの方法があります - これらはActiveRecord::Relationオブジェクトとモデルクラスに使用可能になります。これらのメソッドのほとんどはActiveRecord::Relationのオブジェクトを返します。そのため、それらは連鎖可能です(例:

User.where(params).order(created_at: :desc).limit(5) 

しかしfind_byは例外です - あなたは結果に照会し続けることができないので、それはモデルインスタンスを返します。要約するとUser.new(params)は、find_byがないモデルのインスタンスを返します。

関連する問題