2016-07-05 34 views
0

私はドメインホストのURLレコードは再びそれを作成する前に、ドメインのテーブルに存在するかどうかを確認しようとしていますが、私はこのエラーを取得しています:未定義のnew_record? RubyのRailsの

undefined method `new_record?' for #<Domain::ActiveRecord_Relation:0x007f320ed8af80> 

クラスGetMetaが初期化になっているサービスオブジェクトがあるがユーザーがフォームにURLを入力して「送信」をクリックすると、私は、フォームからURLを取得し、MetaInspectorを呼び出してより多くのメタ情報を取得しています。

最初の部分(if)new_recordメソッドは完全に正常に動作していますが、ドメインテーブルに重複した値を作成しています。私は条件付きロジックを作成しようとしましたが、私はこのバグを抱えており、修正方法はわかりません。

class GetMeta 
    include ActiveModel::Model 

    def initialize(url) 
    @url = url 
    end 

    def new_record 

    page = MetaInspector.new(@url) 
    @domain = Domain.where(:host => page.host) 

    if new_record? 
     Domain.create! do |url| 
     url.root_url = page.root_url 
     url.scheme = page.scheme 
     url.host = page.host 

     url.links.build(url: page.url, title: page.best_title, description: page.description) 
     end 
    else 
     Link.create! do |link| 
     link.url = page.url 
     link.title = page.best_title 
     link.description = page.description 
     end 
    end 
    end 

    private 

    def new_record? 
    @domain.new_record? 
    end 

end 

答えて

2

この問題はエラーによって説明されます。見てみましょう:

undefined method `new_record?' for 
#<Domain::ActiveRecord_Relation:0x007f320ed8af80> 

問題はこれではなく、単一のレコードのActiveRecordの関係を返す行 @domain = Domain.where(:host => page.host)

です。 .firstまたは.lastを取る必要があります。修正をだが、我々は、コードを改善する方法を見てみましょう

@domain = Domain.where(:host => page.host).last

私たちは、ActiveRecordの関係で定義されている方法 exists?(ドキュメント: http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-exists-3F)を使用することができます

私は今、このエラーを取得しています

if Domain.exists?(host: page.host) 
    Link.create! do |link| 
    link.url = page.url 
    link.title = page.best_title 
    link.description = page.description 
    end 
else 
    Domain.create! do |url| 
    url.root_url = page.root_url 
    url.scheme = page.scheme 
    url.host = page.host 

    url.links.build(url: page.url, title: page.best_title, description: page.description) 
    end 
end 

に我々はインスタンス変数@domainとヘルパーメソッドnew_record?

+0

ありがとうございました!コードは機能していますが、存在するメソッドは償却されています(http://apidock.com/rails/ActiveRecord/Base/exists%3F/class)。 – user3100151

+0

apidocsに「メソッドの非推奨または移動」と表示されています。このメソッドは非推奨ではありません - 自分でレールでチェックしてください4.2.6 また、ここで、Domain.where(host:page.host).exists? – nekath

+0

さようなら!それを得ました、ありがとう – user3100151

1

インスタンスメソッド内からインスタンスメソッドを呼び出しています。だからあなたはあなたが参照しているインスタンスを指定する必要があります。あなたは '自己'を使う必要があります。だから単に 'new_record?'を呼び出すのではなく、self.new_recordを呼び出してみてください。

+0

を必要としないこの道を:プライベートメソッド 'new_record? ' # を呼びましたか? new_record – user3100151

関連する問題